这篇文章主要讲图像的边缘化处理,之前我已经讲解了图像的灰度化和二值化,在图像处理中还有对图像边缘化的处理,这里我采用各种不同的算子处理图像,读者可以自己看出这些算子的效果。
在写代码之前,我参考了一下这个资料,其实关于图像边缘化的原理,网上有很多,也很详细,这里就不多说了。
https://blog.csdn.net/guanyuqiu/article/details/52993412
先给出用sobel算子的程序:
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
int Gray[1500][1000];
int result[1500][1000];
IMAGE img1;
int imagHight,imagWidth;
int main()
{
int i,j,Gx,Gy,nSum;
// 读取图片至绘图窗口
loadimage(&img1, _T("D:\\testh.bmp"));
imagHight = img1.getheight();
imagWidth = img1.getwidth();
initgraph(imagWidth,imagHight, SHOWCONSOLE|NOCLOSE|NOMINIMIZE);
putimage(0, 0, &img1);
_getch();
DWORD* pMem = GetImageBuffer();
//1.图像灰度化
for(i = 0; i <imagHight; i++)
{
for(j=0;j<imagWidth;j++)
{
*pMem = BGR(*pMem);
Gray[i][j] = (GetRValue(*pMem)*299+GetGValue(*pMem)*587+GetBValue(*pMem)*114+500)/1000;
*pMem = RGB(Gray[i][j],Gray[i][j],Gray[i][j]);
pMem++;
}
}
pMem-=imagHight*imagWidth;;
//2.对图像利用算子处理
for(i =1; i <imagHight-1; i++)
{
for(j=1;j<imagWidth-1;j++)
{
//sobel算子
Gx = (-1)*Gray[i-1][j-1]+Gray[i+1][j-1]-2*Gray[i-1][j]+2*Gray[i+1][j]-Gray[i-1][j+1]+Gray[i+1][j+1];
Gy = Gray[i-1][j-1] +2*Gray[i][j-1]+Gray[i+1][j-1]-Gray[i-1][j+1]-2*Gray[i][j+1]-Gray[i+1][j+1];
nSum = abs(Gx)+abs(Gy);
if( nSum>175)
result[i][j] = 255;
else
result[i][j] = 0;
}
}
//3.将处理后的图像显示出来
for(i = 0; i <imagHight; i++)
{
for(j=0;j<imagWidth;j++)
{
*pMem = RGB(result[i][j],result[i][j],result[i][j]);
pMem++;
}
}
FlushBatchDraw();
// 按任意键退出
_getch();
closegraph();
}
这里给sobel算子的效果图:
这里使用不同的算子只要将下面的代码改一下:
//sobel算子
Gx = (-1)*Gray[i-1][j-1]+Gray[i+1][j-1]-2*Gray[i-1][j]+2*Gray[i+1][j]-Gray[i-1][j+1]+Gray[i+1][j+1];
Gy = Gray[i-1][j-1] +2*Gray[i][j-1]+Gray[i+1][j-1]-Gray[i-1][j+1]-2*Gray[i][j+1]-Gray[i+1][j+1];
nSum = abs(Gx)+abs(Gy);
if( nSum>175)
result[i][j] = 255;
else
result[i][j] = 0;
改为:
//Robert算子
nSum = abs(Gray[i+1][j+1]-Gray[i][j])+abs(Gray[i+1][j]-Gray[i][j+1]);
if( nSum>175)
result[i][j] = 255;
else
result[i][j] = 0;
Robert算子的效果图:
这里边缘化的效果并不是很好,是因为阈值的问题,不同的算子处理时的阈值不同,这里将阈值从175变成50,效果图:
扫描二维码关注公众号,回复:
11069744 查看本文章
这里采用拉普拉斯算法:
//拉普拉斯算子
nSum = 4*Gray[i][j] - Gray[i+1][j]-Gray[i][j-1]-Gray[i][j+1]-Gray[i-1][j];
if( nSum>35)
result[i][j] = 255;
else
result[i][j] = 0;
效果图:
有兴趣的可以多试一下其他的算子,阈值的话也可以调一下。