/* Sobel templatea00 a01 a02a10 a11 a12a20 a21 a22*/unsigned char a00, a01, a02unsigned char a10, a11, a12unsigned char a20, a21, a22void MySobel(IplImage* gray, IplImage* gradient){CvScalar color for (int i=1 i<gray->height-1 ++i){for (int j=1 j<gray->width-1 ++j){a00 = cvGet2D(gray, i-1, j-1).val[0]a01 = cvGet2D(gray, i-1, j).val[0]a02 = cvGet2D(gray, i-1, j+1).val[0]a10 = cvGet2D(gray, i, j-1).val[0]a11 = cvGet2D(gray, i, j).val[0]a12 = cvGet2D(gray, i, j+1).val[0]a20 = cvGet2D(gray, i+1, j-1).val[0]a21 = cvGet2D(gray, i+1, j).val[0]a22 = cvGet2D(gray, i+1, j+1).val[0]// x方向上的近似导数double ux = a20 * (1) + a21 * (2) + a22 * (1)+ (a00 * (-1) + a01 * (-2) + a02 * (-1))// y方向上的近似导数double uy = a02 * (1) + a12 * (2) + a22 * (1)+ a00 * (-1) + a10 * (-2) + a20 * (-1)color.val[0] = sqrt(ux*ux + uy*uy)cvSet2D(gradient, i, j, color)}}}//注释:该程序需要在安装Opencv软件下运行。Matlabps=imread('D:\14.jpg') %读取图像subplot(1,3,1)imshow(ps)title('原图像')ps=rgb2gray(ps)[m,n]=size(ps) %用Sobel微分算子进行边缘检测pa = edge(ps,'sobel')subplot(1,3,2)imshow(pa)title('Sobel边缘检测得到的图像')
自己以前图像处理的时候写的,用的是C++, 不过处理流程一样的,可以参考一下//Soble
void CBmp::RhSobel()
{
double temp[9]
DWORD m_Y=m_pInfo->bmiHeader.biHeight
DWORD m_X=WIDTH((m_pInfo->bmiHeader.biWidth)*(m_pInfo->bmiHeader.biBitCount))
BYTE *m_B=(BYTE *) new char[m_Y*m_X]
for(int d=0d<m_nPixelsd++)
{
m_B[d]=m_pPixels[d]
}
if((m_pInfo->bmiHeader.biBitCount)==24)
for(int i=1i<m_Y-1i++)
for(int j=3j<(m_X-2)j+=3)
{
for(int n=0n<9n+=3)
{
temp[n]=(m_B[(i-1+n/3)*m_X+j-3]+m_B[(i-1+n/3)*m_X+j-2]+m_B[(i-1+n/3)*m_X+j-1])/3
temp[n+1]=(m_B[(i-1+n/3)*m_X+j]+m_B[(i-1+n/3)*m_X+j+1]+m_B[(i-1+n/3)*m_X+j+2])/3
temp[n+2]=(m_B[(i-1+n/3)*m_X+j+3]+m_B[(i-1+n/3)*m_X+j+4]+m_B[(i-1+n/3)*m_X+j+5])/3
}
m_pPixels[i*m_X+j]=m_pPixels[i*m_X+j+1]=m_pPixels[i*m_X+j+2]=//
(BYTE((abs(temp[2]+2*temp[5]+temp[8]-//
temp[0]-2*temp[3]-temp[6])+
abs(temp[0]+2*temp[1]+temp[2]-//
temp[6]-2*temp[7]-temp[8]))))
}
else
for(int i=1i<(m_Y-1)i++)
{
for(int j=1j<(m_X-1)j++)
{
m_pPixels[i*m_X+j]=(abs(m_B[(i-1)*m_X+j+1]+(2*m_B[(i)*m_X+j+1])+m_B[(i+1)*m_X+j+1]-//
m_B[(i-1)*m_X+j-1]-(2*m_B[(i)*m_X+j-1])-m_B[(i+1)*m_X+j-1])+
abs(m_B[(i-1)*m_X+j-1]+(2*m_B[(i-1)*m_X+j])+m_B[(i-1)*m_X+j+1]-//
m_B[(i+1)*m_X+j-1]-(2*m_B[(i+1)*m_X+j])-m_B[(i+1)*m_X+j+1]))
}
}
}
//Prewitt
void CBmp::ByPrewitt()
{
double temp1,temp2
DWORD m_Y=m_pInfo->bmiHeader.biHeight
DWORD m_X=WIDTH((m_pInfo->bmiHeader.biWidth)*(m_pInfo->bmiHeader.biBitCount))
BYTE *m_B=(BYTE *) new char[m_Y*m_X]
for(int d=0d<m_nPixelsd++)
{
m_B[d]=m_pPixels[d]
}
if(m_pInfo->bmiHeader.biBitCount==8)
for(int i=1i<(m_Y-1)i++)
{
for(int j=1j<(m_X-1)j++)
{
temp1=abs(m_B[(i-1)*m_X+j+1]-m_B[(i-1)*m_X+j-1]+m_B[i*m_X+j+1]-//
m_B[i*m_X+j-1]+m_B[(i+1)*m_X+j+1]-m_B[(i+1)*m_X+j-1])
temp2=abs(m_B[(i-1)*m_X+j-1]+m_B[(i-1)*m_X+j]+m_B[(i-1)*m_X+j+1]-//
m_B[(i+1)*m_X+j-1]-m_B[(i+1)*m_X+j]-m_B[(i+1)*m_X+j+1])
m_pPixels[i*m_X+j]=(temp1>temp2?temp1:temp2)
}
}
else
{
Huidu()
for(int i=1i<(m_Y-1)i++)
{
for(int j=3j<(m_X-5)j+=3)
{
temp1=abs(m_B[(i-1)*m_X+j+3]-m_B[(i-1)*m_X+j-3]+m_B[i*m_X+j+3]-//
m_B[i*m_X+j-3]+m_B[(i+1)*m_X+j+3]-m_B[(i+1)*m_X+j-3])
temp2=abs(m_B[(i-1)*m_X+j-3]+m_B[(i-1)*m_X+j]+m_B[(i-1)*m_X+j+3]-//
m_B[(i+1)*m_X+j-3]-m_B[(i+1)*m_X+j]-m_B[(i+1)*m_X+j+3])
m_pPixels[i*m_X+j]=m_pPixels[i*m_X+j+1]=m_pPixels[i*m_X+j+2]=(temp1>temp2?temp1:temp2)
}
}
}
}