C语言实现BMP图像边缘检测处理

2022-07-21,,,,

本文实例为大家分享了c语言实现bmp图像边缘检测处理的具体代码,供大家参考,具体内容如下

以sobel算子为例,其余模板算子卷积代码部分同sobel算子。如:高斯算子、拉普拉斯算子等

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
 
int main(int* argc, char** argv)
{
 file* fp = fopen("./01.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("sobel.bmp", "wb");
 if (fop == 0)
  return 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) = *(pbmpbuf + i*linebyte + j);
  }
 }
 
 
 int ul, uc, ur, dl, dc, dr;
 int lu, lc, ld, ru, rc, rd;
 double hir, vec;
 for (int i = 1; i < height - 1; ++i){
  for (int j = 1; j < width - 1; ++j){
   // 垂直梯度算子:检测水平边缘
   vec = 0;
   ul = *(pbmpbuf + (i + 1)*linebyte + (j - 1))*(-1);
   uc = *(pbmpbuf + (i + 1)*linebyte + j)*(-2);
   ur = *(pbmpbuf + (i + 1)*linebyte + j)*(-1);
   dl = *(pbmpbuf + (i - 1)*linebyte + (j - 1)) * 1;
   dc = *(pbmpbuf + (i - 1)*linebyte + j) * 2;
   dr = *(pbmpbuf + (i - 1)*linebyte + j) * 1;
   vec = ul + uc + ur + dl + dc + dr;
   // 水平梯度算子:检测垂直边缘
   hir = 0;
   lu = *(pbmpbuf + (i + 1)*linebyte + (j - 1))*(-1);
   lc = *(pbmpbuf + (i - 0)*linebyte + (j - 1))*(-2);
   ld = *(pbmpbuf + (i - 1)*linebyte + (j - 1))*(-1);
   ru = *(pbmpbuf + (i + 1)*linebyte + (j + 1)) * 1;
   rc = *(pbmpbuf + (i - 0)*linebyte + (j + 1)) * 2;
   rd = *(pbmpbuf + (i - 1)*linebyte + (j + 1)) * 1;
   hir = lu + lc + ld + ru + rc + rd;
   *(pbmpbuf2+i*linebyte+j) = round(sqrt(hir*hir + vec*vec));
  }
 }
 
 fwrite(&filehead, sizeof(bitmapfileheader), 1, fop);
 fwrite(&infohead, sizeof(bitmapinfoheader), 1, fop);
 fwrite(pcolortable, sizeof(rgbquad), 256, fop);
 fwrite(pbmpbuf2, linebyte*height, 1, fop);
 fclose(fop);
 
 system("pause");
 return 0;
}

实验结果:

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

《C语言实现BMP图像边缘检测处理.doc》

下载本文的Word格式文档,以方便收藏与打印。