easyx(C言語)に基づく単純な画像処理III

  この記事では主に画像のエッジ処理について説明しますが、画像のグレー化と2値化については既に説明しましたが、画像処理では画像のエッジ処理もあります。ここでは、さまざまな演算子を使用して画像を処理します、読者はこれらの演算子の効果を見ることができます。

コードを記述する前に、この情報を参照しましたが、実際には、画像周辺化の原理に関するオンラインでの詳細な説明がたくさんあるため、ここでは詳しく説明しません。

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算子
	     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