</pre>由两个卷积核形成Prewitt边缘检测算子, 分别用卷积核对图像卷积,比较图像点,取其最大值。
Template1[9] = { -1, -1, -1,
<span style="white-space:pre"> </span> 0, 0, 0,
<span style="white-space:pre"> </span> 1, 1, 1 };
Template2[9] = { 1, 0, -1,
<span style="white-space:pre"> </span> 1, 0, -1,
<span style="white-space:pre"> </span>1, 0, -1 };
#include"cv.h"
#include "highgui.h"
void Prewitt(CvMat* gray, CvMat* edge);
int main()
{
IplImage *src = cvLoadImage("flower.jpg",1);
const int width = src->width;
const int height = src->height;
CvMat *gray = cvCreateMat(height, width, CV_8UC1);
cvCvtColor(src, gray, CV_BGR2GRAY);
CvMat *edge = cvCreateMat(height, width, CV_8UC1);
Prewitt(gray, edge);
cvShowImage("SRC", src);
cvShowImage("GRAY", gray);
cvShowImage("ROBERTS", edge);
cvWaitKey(0);
cvCvtColor(gray, src, CV_GRAY2BGR);
cvSaveImage("GRAY.bmp", src);
cvCvtColor(edge, src, CV_GRAY2BGR);
cvSaveImage("EDGE.bmp", src);
cvReleaseMat(&gray);
cvReleaseMat(&edge);
return 0;
}
void Prewitt(CvMat* gray, CvMat* edge)
{
const int width = gray->width;
const int height = gray->height;
cvZero(edge);
CvMat* edgeTemp1 = cvCreateMat(height, width, CV_16SC1);
CvMat* edgeTemp2 = cvCreateMat(height, width, CV_16SC1);
cvZero(edgeTemp1);
cvZero(edgeTemp2);
int Template1[9] = { -1, -1, -1,
0, 0, 0,
1, 1, 1 };
int Template2[9] = { 1, 0, -1,
1, 0, -1,
1, 0, -1 };
for (int j = 1; j < height - 1; j ++)
{
int* edgeTemp1Data = (int*)(edgeTemp1->data.ptr + j * edgeTemp1->step);
for (int i = 1; i < width - 1; i ++)
{
for (int k = 0; k < 3; k ++)
{
for (int l = 0; l < 3; l ++)
{
edgeTemp1Data[i] += Template1[3 * k + l] * ((uchar*)(gray->data.ptr + (j + k - 1) * gray->step))[i + l - 1];
}
}
}
}
for (int j = 1; j < height - 1; j ++)
{
int* edgeTemp2Data = (int*)(edgeTemp2->data.ptr + j * edgeTemp2->step);
for (int i = 1; i < width - 1; i ++)
{
for (int k = 0; k < 3; k ++)
{
for (int l = 0; l < 3; l ++)
{
edgeTemp2Data[i] += Template2[3 * k + l] * ((uchar*)(gray->data.ptr + (j + k - 1) * gray->step))[i + l - 1];
}
}
}
}
for (int j = 0; j < height; j ++)
{
uchar* edgeData = (uchar*)(edge->data.ptr + j * gray->step);
int* edgeTemp1Data = (int*)(edgeTemp1->data.ptr + j * edgeTemp1->step);
int* edgeTemp2Data = (int*)(edgeTemp2->data.ptr + j * edgeTemp2->step);
for (int i = 0; i < width; i ++)
{
int value = edgeTemp1Data[i] > edgeTemp2Data[i] ? edgeTemp1Data[i] : edgeTemp2Data[i];
if(value > 255)
value = 255;
if(value < 0)
value = 0;
edgeData[i] = value;
}
}
cvReleaseMat(&edgeTemp1);
cvReleaseMat(&edgeTemp2);
}
原图,灰图和结果图如下: