Sobel算子的C代码

Python015

Sobel算子的C代码,第1张

/* 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)

}

}

}

}