影象邊緣檢測—sobel運算元(灰度影象,彩色影象)

Renaissance5K發表於2017-03-11

影象為 I.然後進行如下的操作:

 為了在一副影象f的(x,y)位置處尋找邊緣的強度和方向,所選擇的工具就是梯度,向量定義為:


z1 z2 z3
z4 z5 z6
z7 z8 z9



分別在x和y兩個方向求導。


該點梯度:


梯度的方向:


以下是灰度圖與灰度圖sobel邊緣



vc++ MFC編寫的程式,灰度圖影象畫素陣列是靜態申請的,Data[i][j]為畫素值,i,j為座標,因為畫素申請int 型,處理結果可能會超出[0,255],所以結果要判斷大於255為255。畫素型別為unsigned char就不會出現這個問題。

void CShowPicView::OnSOBELgradient() //SOBEL梯度  //Sobel邊緣檢測演算法
{
	CShowPicDoc* pDoc = GetDocument();
	CDC* pDC=GetDC();
	// 字串
	CString str;

	int lWidth	=intWidth;
	int lHeight =intHeight;
	int			i;
	int			j;
	
	unsigned char g[610][800];
	int gx,gy,temp1;
	for(j = 1; j < intWidth-1; j++)
	{
		for(i = 1; i 255)
				g[i][j]=255;
			else
				g[i][j]=temp1;

			pDC->SetPixel(j+intWidth+30,i,RGB(g[i][j],g[i][j],g[i][j]));
			
		}
	}


	str.Format("SOBEL");
	pDC->TextOut((int)(intWidth*1.5+50), intHeight, str);
	
}

以下是原圖(彩色圖)與彩色圖sobel邊緣:



vc++ MFC編寫的程式,彩色圖影象畫素陣列是動態申請的,pic[y][x][0],pic[y][x][1],pic[y][x][2] 為原圖的三通道的畫素值,x,y為座標值

void CShowPicView::Ontwodimension() 
{
	CShowPicDoc* pDoc = GetDocument();
	CDC* pDC=GetDC();
	// 字串
	CString str;
	int x,y;
	int i,n;
	x=intHeight;
	y=intWidth;

	int **g1,**g2,**g3;

	g1 = new int*[x]; //行 //申請行的空間
	g2 = new int*[x]; 
	g3 = new int*[x]; 
	//每行的列申請空間
	for(i=0; ipic[y+1][x-1][0]+2*pDoc->pic[y+1][x][0]+pDoc->pic[y+1][x+1][0] - pDoc->pic[y-1][x-1][0]-2*pDoc->pic[y-1][x][0]-pDoc->pic[y-1][x+1][0];
		gy1=pDoc->pic[y-1][x-1][0]+2*pDoc->pic[y][x-1][0]+pDoc->pic[y+1][x-1][0] - pDoc->pic[y-1][x+1][0]-2*pDoc->pic[y][x+1][0]-pDoc->pic[y+1][x+1][0];
		if(sqrt(gx1*gx1+gy1*gy1)>255)
			g1[y][x]=255;
		else
			g1[y][x]=sqrt(gx1*gx1+gy1*gy1);

		gx2=pDoc->pic[y+1][x-1][1]+2*pDoc->pic[y+1][x][1]+pDoc->pic[y+1][x+1][1] - pDoc->pic[y-1][x-1][1]-2*pDoc->pic[y-1][x][1]-pDoc->pic[y-1][x+1][1];
		gy2=pDoc->pic[y-1][x-1][1]+2*pDoc->pic[y][x-1][1]+pDoc->pic[y+1][x-1][1] - pDoc->pic[y-1][x+1][1]-2*pDoc->pic[y][x+1][1]-pDoc->pic[y+1][x+1][1];
		
		if(sqrt(gx2*gx2+gy2*gy2)>255)
			g2[y][x]=255;
		else
			g2[y][x]=sqrt(gx2*gx2+gy2*gy2);

		gx3=pDoc->pic[y+1][x-1][2]+2*pDoc->pic[y+1][x][2]+pDoc->pic[y+1][x+1][2] - pDoc->pic[y-1][x-1][2]-2*pDoc->pic[y-1][x][2]-pDoc->pic[y-1][x+1][2];
		gy3=pDoc->pic[y-1][x-1][2]+2*pDoc->pic[y][x-1][2]+pDoc->pic[y+1][x-1][2] - pDoc->pic[y-1][x+1][2]-2*pDoc->pic[y][x+1][2]-pDoc->pic[y+1][x+1][2];
		if(sqrt(gx3*gx3+gy3*gy3)>255)
			g3[y][x]=255;
		else
			g3[y][x]=sqrt(gx3*gx3+gy3*gy3);


		pDC->SetPixel(x+1*intWidth+30,y,RGB(g1[y][x],g2[y][x],g3[y][x]));
		}
	}

	for(i=0;i

相關文章