千家信息网

怎么用C语言实现BMP图像开运算处理

发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,这篇文章主要介绍"怎么用C语言实现BMP图像开运算处理",在日常操作中,相信很多人在怎么用C语言实现BMP图像开运算处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎
千家信息网最后更新 2024年11月30日怎么用C语言实现BMP图像开运算处理

这篇文章主要介绍"怎么用C语言实现BMP图像开运算处理",在日常操作中,相信很多人在怎么用C语言实现BMP图像开运算处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么用C语言实现BMP图像开运算处理"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

开运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。滤掉比结构元素小的突刺,切断细长搭接而起到分离作用。

运算:用B开启A就是选出了A中某些与B相匹配的点,这些点可由完全包含在A中的结构元素B的平移得到。也就是先腐蚀后加膨胀。

#include #include #include  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; pBmpBuf = new unsigned char[lineByte*height]; fread(pBmpBuf, lineByte*height, 1, fp); fclose(fp);  // 新图 FILE* fop = fopen("open.bmp", "wb"); if (fop == 0)  return 0;  // 定义结构元素 // 腐蚀操作  int t = 0, d = 0, r = 0; for (int i = 1; i < height; ++i){  for (int j = 0; j < width - 1; ++j){   t = *(pBmpBuf + i*lineByte + j);       // 当前点   d = *(pBmpBuf + (i - 1)*lineByte + j); // 下面点   r = *(pBmpBuf + i*lineByte + j + 1);   // 右边点   if (t == 0 && d != 0){    *(pBmpBuf + (i - 1)*lineByte + j) = 0;//下边的置位1   }   if (t == 0 && r != 0){    *(pBmpBuf + i*lineByte + j + 1) = 0;//右边的置位1    j = j + 1;   }  } } // 膨胀操作 // 初始化 unsigned char* pBmpBuf2; pBmpBuf2 = new unsigned char[lineByte*height]; for (int i = 0; i < height; ++i){  for (int j = 0; j < width; ++j){   *(pBmpBuf2 + i*lineByte + j) = 255;  } }  // 腐蚀操作 for (int i = 1; i < height; ++i){  for (int j = 0; j < width - 1; ++j){   t = *(pBmpBuf + i*lineByte + j);       // 当前点   d = *(pBmpBuf + (i - 1)*lineByte + j); // 下面点   r = *(pBmpBuf + i*lineByte + j + 1);   // 右边点   if (t == 0 && d == 0 && r == 0){    *(pBmpBuf2 + i*lineByte + j) = 0;       // 当前点   }  } } // 结构元素向上反转180度,对最下面一排处理 for (int j = 0; j < width - 1; ++j){  t = *(pBmpBuf + j);            // 当前点  d = *(pBmpBuf + lineByte + j); // 上面点  r = *(pBmpBuf + j + 1);        // 右边点  if (t == 0 && d == 0 && r == 0){   *(pBmpBuf2 + j) = 0;       // 当前点  } } // 结构元素向右反转,对最右边一列处理 for (int i = 1; i < height; ++i){  t = *(pBmpBuf + i*lineByte + width - 1);  d = *(pBmpBuf + (i - 1)*lineByte + width - 1);  r = *(pBmpBuf + i*lineByte + width - 2);  if (t == 0 && d == 0 && r == 0){   *(pBmpBuf2 + i*lineByte + width - 1) = 0;       // 当前点  } }  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;}

实验结果:

实验结果分析:效果图和原图差别不大。但细节如眼睛略微由区别。

到此,关于"怎么用C语言实现BMP图像开运算处理"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0