基于easyx的简单图像处理 三 (C语言)

  这篇文章主要讲图像的边缘化处理,之前我已经讲解了图像的灰度化和二值化,在图像处理中还有对图像边缘化的处理,这里我采用各种不同的算子处理图像,读者可以自己看出这些算子的效果。

在写代码之前,我参考了一下这个资料,其实关于图像边缘化的原理,网上有很多,也很详细,这里就不多说了。

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,效果图:

这里采用拉普拉斯算法:

//拉普拉斯算子
 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;

效果图:

有兴趣的可以多试一下其他的算子,阈值的话也可以调一下。

发布了7 篇原创文章 · 获赞 13 · 访问量 2095

猜你喜欢

转载自blog.csdn.net/qq_39036834/article/details/97898219
今日推荐