C語言實現BMP圖像邊緣檢測處理

本文實例為大傢分享瞭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;
}

實驗結果:

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: