千家信息网

C语言如何实现BMP图像闭运算处理

发表于:2024-09-24 作者:千家信息网编辑
千家信息网最后更新 2024年09月24日,这篇文章主要介绍了C语言如何实现BMP图像闭运算处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。闭运算可以把比结构元素小的特定图像细
千家信息网最后更新 2024年09月24日C语言如何实现BMP图像闭运算处理

这篇文章主要介绍了C语言如何实现BMP图像闭运算处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

闭运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。填充比结构元素小的缺口或孔,搭接短的间断而起到连接作用。

运算:也就是先膨胀后腐蚀。

#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("close.bmp", "wb"); if (fop == 0)  return 0;  // 膨胀操作 // 初始化 int t = 0, d = 0, r = 0; 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;       // 当前点  } }  // 腐蚀操作 for (int i = 1; i < height; ++i){  for (int j = 0; j < width - 1; ++j){   t = *(pBmpBuf2 + i*lineByte + j);       // 当前点   d = *(pBmpBuf2 + (i - 1)*lineByte + j); // 下面点   r = *(pBmpBuf2 + i*lineByte + j + 1);   // 右边点   if (t == 0 && d != 0){    *(pBmpBuf2 + (i - 1)*lineByte + j) = 0;//下边的置位1   }   if (t == 0 && r != 0){    *(pBmpBuf2 + i*lineByte + j + 1) = 0;//右边的置位1    j = j + 1;   }  } }  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