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;

}

实验结果:

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

以上是 C语言实现BMP图像边缘检测处理 的全部内容, 来源链接: utcz.com/p/247460.html

回到顶部