用 Matlab 实现的 Prewitt 边缘检测器给出比内置函数更厚的边缘
Prewitt edge detector implemented with Matlab gives thick edges than the in-built function
我实现了 Prewitt 边缘检测器并将我的输出与 Matlab 的内置 Prewitt 边缘检测器进行了比较,我注意到我的输出给出了更厚的边缘。可能是什么原因?
input = imread('pic.png');
input = double(rgb2gray(input));
kernel_x = [-1, 0, 1; -1, 0, 1; -1, 0, 1];
kernel_y = [1, 1, 1; 0, 0, 0; -1, -1, -1];
[length, width] = size(input);
new = input;
for i = 1:length - 2
for j = 1:width - 2
Gx = sum(sum(kernel_x.*input(i:i+2, j:j+2)));
Gy = sum(sum(kernel_y.*input(i:i+2, j:j+2)));
new(i+1, j+1) = sqrt(Gx.^2 + Gy.^2);
end
end
new = uint8(new);
% binarizing image and setting threshold
edge = imbinarize(edge, 100); % final output from implementation
我使用的内置函数是edge(input, 'Prewitt')
我的实现与内置运算符的输出:
这可能是什么原因?
我也试过更改阈值,但还是不行。
文档中没有明确说明,但是对于 Sobel、Prewitt 和 Roberts 方法,edge
应用了细化。有an optional input argument 'nothinning'
,跳过细化步骤。不幸的是,这是文档中唯一表明正在执行此步骤的部分。
如果您有使用 bwmorph(bw,'thin')
的图像处理工具箱,则可以应用细化。
我实现了 Prewitt 边缘检测器并将我的输出与 Matlab 的内置 Prewitt 边缘检测器进行了比较,我注意到我的输出给出了更厚的边缘。可能是什么原因?
input = imread('pic.png');
input = double(rgb2gray(input));
kernel_x = [-1, 0, 1; -1, 0, 1; -1, 0, 1];
kernel_y = [1, 1, 1; 0, 0, 0; -1, -1, -1];
[length, width] = size(input);
new = input;
for i = 1:length - 2
for j = 1:width - 2
Gx = sum(sum(kernel_x.*input(i:i+2, j:j+2)));
Gy = sum(sum(kernel_y.*input(i:i+2, j:j+2)));
new(i+1, j+1) = sqrt(Gx.^2 + Gy.^2);
end
end
new = uint8(new);
% binarizing image and setting threshold
edge = imbinarize(edge, 100); % final output from implementation
我使用的内置函数是edge(input, 'Prewitt')
我的实现与内置运算符的输出:
这可能是什么原因?
我也试过更改阈值,但还是不行。
文档中没有明确说明,但是对于 Sobel、Prewitt 和 Roberts 方法,edge
应用了细化。有an optional input argument 'nothinning'
,跳过细化步骤。不幸的是,这是文档中唯一表明正在执行此步骤的部分。
如果您有使用 bwmorph(bw,'thin')
的图像处理工具箱,则可以应用细化。