Prewitt边缘算子

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

}

原图,灰图和结果图如下:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值