广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言实现BMP图像细化处理
  • 448
分享到

C语言实现BMP图像细化处理

2024-04-02 19:04:59 448人浏览 独家记忆
摘要

细化(thinning)算法有很多,我们在这里介绍的是一种简单而且效果很好的算法,用它就能够实现从文本抽取骨架的功能。我们的对象是白纸黑字的文本,但在程序中为了处理的方便,还是采用

细化(thinning)算法有很多,我们在这里介绍的是一种简单而且效果很好的算法,用它就能够实现从文本抽取骨架的功能。我们的对象是白纸黑字的文本,但在程序中为了处理的方便,还是采用 256 级灰度图,不过只用到了调色板中 0 和 255 两项。

所谓细化,就是从原来的图中去掉一些点,但仍要保持原来的形状。实际上,是保持原图的骨架。所谓骨架,可以理解为图象的中轴,例如一个长方形的骨架是它的长方向上的中轴线;正方形的骨架是它的中心点;圆的骨架是它的圆心,直线的骨架是它自身,孤立点的骨架也是自身。那么怎样判断一个点是否能去掉呢?显然,要根据它的八个相邻点的情况来判断,我们给几个例子(如图 6.22 所示)。

图 6.22 中,(1)不能删,因为它是个内部点,我们要求的是骨架,如果连内部点也删了,骨架也会被掏空的;(2)不能删,和(1)是同样的道理;(3)可以删,这样的点不是骨架;(4)不能删,因为删掉后,原来相连的部分断开了;(5)可以删,这样的点不是骨架;(6)不能删,因为它是直线的端点,如果这样的点删了,那么最后整个直线也被删了,剩不下什么。总结一下,有如下的判据:(1)内部点不能删除;(2)孤立点不能删除;(3)直线端点不能删除;(4)如果 P 是边界点,去掉 P 后,如果连通分量不增加,则 P 可以删除。

我们可以根据上述的判据,事先做出一张表,从 0 到 255 共有 256 个元素,每个元素要么是0,要么是 1。我们根据某点(当然是要处理的黑色点了)的八个相邻点的情况查表,若表中的元素是 1,则表示该点可删,否则保留。


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
int main(int* arGC, char** argv)
{
 FILE* fp = fopen("./threshold.bmp", "rb");
 if (fp == 0)
  return 0;
 BITMAPFILEHEADER fileHead;
 fread(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);
 
 BITMapiNFOHEADER infoHead;
 fread(&infoHead, sizeof(BITMAPINFOHEADER), 1, fp);
 int width = infoHead.biWidth;
 int height = infoHead.biHeight;
 int biCount = infoHead.biBitCount;
 
 int lineByte = (biCount*width / 8 + 3) / 4 * 4;
 RGBQUAD* pColorTable;
 pColorTable = new RGBQUAD[256];
 fread(pColorTable, sizeof(RGBQUAD), 256, fp);
 
 unsigned char* pBmpBuf,*pBmpBuf2;
 pBmpBuf = new unsigned char[lineByte*height];
 fread(pBmpBuf, lineByte*height, 1, fp);
 fclose(fp);
 
 // 新图
 FILE* fop = fopen("thinging.bmp", "wb");
 if (fop == 0)
  return 0;
 
 pBmpBuf2 = new unsigned char[lineByte*height];
 for (int i = 0; i < height; ++i){
  for (int j = 0; j < width; ++j){
   *(pBmpBuf2 + i*lineByte + j) = *(pBmpBuf + i*lineByte + j);
  }
 }
 
 // 比较矩阵,0为黑,1为白; 
 // 1:不能;2:不能;3:能;4:不能;5:能;6:不能
 char str[6][8] = { { 0, 0, 0, 0, 0, 0, 0, 0, }, { 255, 0, 255, 0, 0, 255, 0, 0 },
 { 255, 0, 255, 255, 0, 255, 0, 255 }, { 255, 255, 255, 0, 0, 255, 255, 255 },
 { 255, 0, 255, 255, 0, 255, 255, 255 }, { 0, 255, 255, 255, 255, 255, 255, 255 } };
 int temp, k;
 char strTemp[8];
 for (int i = 1; i < height-1; ++i){
  for (int j = 1; j < width - 1; ++j){
   k = 0;
   for (int m = -1; m <= 1; ++m){
    for (int n = -1; n <= 1; ++n){
     temp = *(pBmpBuf + (i - m)*lineByte + (j + n));
     strTemp[k] = temp;
     k++;
    }
   }
   for (int k = 0; k < 6; ++k){
    if (strcmp(strTemp, str[k])==0){
     if (k == 3 || k == 5){
      *(pBmpBuf2 + i*lineByte + j) = 255;
     }
    }
   }
  }
 }
 
 
 fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fop);
 fwrite(&infoHead, sizeof(BITMAPINFOHEADER), 1, fop);
 fwrite(pColorTable, sizeof(RGBQUAD), 255, fop);
 fwrite(pBmpBuf2, lineByte*height, 1, fop);
 fclose(fop);
 
 system("pause");
 return 0;
}

实验结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C语言实现BMP图像细化处理

本文链接: https://www.lsjlt.com/news/155337.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言实现BMP图像细化处理
    细化(thinning)算法有很多,我们在这里介绍的是一种简单而且效果很好的算法,用它就能够实现从文本抽取骨架的功能。我们的对象是白纸黑字的文本,但在程序中为了处理的方便,还是采用 ...
    99+
    2022-11-12
  • C语言实现BMP图像处理(直方图均衡化)
    本文实例为大家分享了C语言实现BMP图像直方图均衡化处理的具体代码,供大家参考,具体内容如下 计算步骤: 1)统计各灰度值的概率; 2)计算了累积概率直方图(CDF); 3)取整扩展...
    99+
    2022-11-12
  • C语言实现BMP图像闭运算处理
    闭运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。填充比结构元素小的缺口或孔,搭接短的间断而起到连接作用。 运算:也就是先膨胀后腐蚀。 #include ...
    99+
    2022-11-12
  • C语言实现BMP图像开运算处理
    开运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。滤掉比结构元素小的突刺,切断细长搭接而起到分离作用。 运算:用B开启A就是选出了A中某些与B相匹配的点,这些...
    99+
    2022-11-12
  • C语言实现BMP图像边缘检测处理
    本文实例为大家分享了C语言实现BMP图像边缘检测处理的具体代码,供大家参考,具体内容如下 以Sobel算子为例,其余模板算子卷积代码部分同Sobel算子。如:高斯算子、拉普拉斯算子等...
    99+
    2022-11-12
  • C语言实现BMP图像处理(彩色图转灰度图)
    我们知道真彩图不带调色板,每个象素用 3 个字节,表示 R、G、B 三个分量。所以处理很简单,根据 R、G、B 的值求出 Y 值后,将 R、G、B 值都赋值成 Y,写入新图即可。 在...
    99+
    2022-11-12
  • C语言实现BMP图像处理(哈夫曼编码)
    哈夫曼(Huffman)编码是一种常用的压缩编码方法,是 Huffman 于 1952 年为压缩文本文件建立的。它的基本原理是频繁使用的数据用较短的代码代替,较少使用的数据用较长的代...
    99+
    2022-11-12
  • C语言实现bmp图像平移操作
    平移变换是一种几何变换。平移的公式为:x1=x0+t,y1=y0+t,其中(x0,y0)是原图像中的坐标,(x1,y1)是经过平移变换后的对应点的坐标。 在编程中,先将处理后图像的所...
    99+
    2022-11-12
  • C语言实现BMP图像的读写功能
    C语言实现BMP图像的读写 对于刚接触数字图像的同学,应该都有一个疑问,如何把一个BMP格式的图像用纯C语言读入呢,我相信这也是数字图像处理的第一步,如果有幸看到这篇文档,我就有幸的...
    99+
    2022-11-12
  • C语言实现bmp图像对比度扩展
    假设有一幅图,由于成象时光照不足,使得整幅图偏暗(例如,灰度范围从0到63);或者成象时光照过强,使得整幅图偏亮(例如,灰度范围从200到255),我们称这些情况为低对比度,即灰度都...
    99+
    2022-11-12
  • C语言实现将彩色bmp图像转化为灰图、灰度图像反色
    本文实例为大家分享了C语言实现将彩色bmp图像转化为灰图、灰度图像反色的具体代码,供大家参考,具体内容如下 彩色图像转灰度图像 彩色(24位)bmp图像结构: typedef s...
    99+
    2022-11-12
  • C语言如何实现BMP图像读写功能
    这篇文章给大家分享的是有关C语言如何实现BMP图像读写功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C语言实现BMP图像的读写对于刚接触数字图像的同学,应该都有一个疑问,如何把一个BMP格式的图像用纯C语言读...
    99+
    2023-06-14
  • C语言实现BMP格式图片转化为灰度
    本文实例为大家分享了C语言将BMP格式图片转化为灰度的具体代码,供大家参考,具体内容如下 代码如下: #include<stdio.h> #include<ma...
    99+
    2022-11-12
  • C语言数字图像处理之图像缩放
    本文实例为大家分享了C语言实现图像缩放的具体代码,供大家参考,具体内容如下 1. 定义(摘自维基百科) 在计算机图形学中,图像缩放指的是通过增加或去掉像素来改变图片的尺寸。由于要在效...
    99+
    2022-11-12
  • C语言数字图像处理之直方图均衡化
    本文实例为大家分享了C语言直方图均衡化的具体代码,供大家参考,具体内容如下 原理 直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非...
    99+
    2022-11-12
  • C语言实现24位彩色图像二值化
    本文实例为大家分享了C语言实现24位彩色图像二值化的具体代码,供大家参考,具体内容如下 // huiduhua.cpp : 定义控制台应用程序的入口点。 // #includ...
    99+
    2022-11-12
  • c语言图像识别算法怎么实现
    要实现图像识别算法,可以使用以下步骤: 数据预处理:首先,将图像转换为数字矩阵表示。可以使用图像处理库(例如OpenCV)读取图...
    99+
    2023-10-24
    c语言
  • C语言实现二值图像模拟灰值图像显示效果
    本文实例为大家分享了C语言实现二值图像模拟灰值图像显示效果的具体代码,供大家参考,具体内容如下 图案法 图案法(patterning)是指灰度可以用一定比例的黑白点组成的区域表示,从...
    99+
    2022-11-12
  • C语言实现直方图均衡化
    直方图均衡化部分是用c语言写的,最后用opencv显示原图像,处理后图像以及原图和处理后图的灰度直方图。 虽然做出来了,均衡化效果还可以,但不知道为什么处理后图像中有三条白线,真心搞...
    99+
    2022-11-12
  • Flutter+Metal实现图像处理详细流程
    背景 在之前自制的图像处理App中,使用了OpenGL处理图片,这次使用Metal替代OpenGL,来达到更好的性能,顺便熟悉一下Metal的渲染流程 基本思路 Flutter使用...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作