本文主要是介绍Prewitt算子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到
极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图
像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。
G(i)=|[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]|
G(j)=|[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]|
则 P(i,j)=max[G(i),G(j)]或 P(i,j)=G(i)+G(j)
经典Prewitt算子认为:凡灰度新值大于或等于阈值的像素点都是边缘点。即选择适当的阈值T,若P(i,j)≥T,则(i,j)为边缘点,P(i,j)为边缘图像。这种判定是欠合理的,会造成边缘点的误判,因为许多噪声点的灰度值也很大,而且对于幅值较小的边缘点,其边缘反而丢失了。
Prewitt算子程序: clc clear all close all A = imread('tig.jpg'); %读入图像 imshow(A);title('原图'); y_mask = [-1 -1 -1;0 0 0;1 1 1]; %建立Y方向的模板 x_mask = y_mask'; %建立X方向的模板 I = im2double(A); %将图像数据转化为双精度 dx = imfilter(I, x_mask); %计算X方向的梯度分量 dy = imfilter(I, y_mask); %计算Y方向的梯度分量 grad = sqrt(dx.*dx + dy.*dy); %计算梯度 grad = mat2gray(grad); %将梯度矩阵转换为灰度图像 level = graythresh(grad); %计算灰度阈值 BW = im2bw(grad,level); %用阈值分割梯度图像 figure, imshow(BW); %显示分割后的图像即边缘图像 title('Prewitt')
这篇关于Prewitt算子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!