图像边缘检测—sobel算子(灰度图像,彩色图像)

图像为 I.然后进行如下的操作:

 为了在一副图像f的(x,y)位置处寻找边缘的强度和方向,所选择的工具就是梯度,向量定义为:


z1 z2 z3
z4 z5 z6
z7 z8 z9



分别在x和y两个方向求导。

图像边缘检测—sobel算子(灰度图像,彩色图像)_第1张图片

该点梯度:


梯度的方向:


以下是灰度图与灰度图sobel边缘

图像边缘检测—sobel算子(灰度图像,彩色图像)_第2张图片

图像边缘检测—sobel算子(灰度图像,彩色图像)_第3张图片

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边缘:

图像边缘检测—sobel算子(灰度图像,彩色图像)_第4张图片

图像边缘检测—sobel算子(灰度图像,彩色图像)_第5张图片

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

你可能感兴趣的:(vc++,图像处理)