python中pixels函数_python - 如何在Python中制作像Edge()Matlab函数一样的Canny边缘检测器 - 堆栈内存溢出...

我想在Python中使用edge() Matlab函数:

mask = double(edge(mask,'canny',threshold));

我试图找到一个等效于Python中edge() Matlab函数的函数。 我曾在那个论坛上尝试过建议先用高斯模糊对图像进行模糊处理,但结果仍然与Matlab有所不同。

因此,我找到了一些Matlab Canny边缘检测器代码,并试图将此代码转换为类似于Matlab的内置edge()函数。 我找到的代码是:

第一个代码:

clear all;

clc;

%Input image

img = imread ('gambar.jpg');

%Show input image

figure, imshow(img);

img = rgb2gray(img);

img = double (img);

%Value for Thresholding

T_Low = 0.2;

T_High = 0.5;

%Gaussian Filter Coefficient

B = [2, 4, 5, 4, 2; 4, 9, 12, 9, 4;5, 12, 15, 12, 5;4, 9, 12, 9, 4;2, 4, 5, 4, 2 ];

B = 1/159.* B;

%Convolution of image by Gaussian Coefficient

A=conv2(img, B, 'same');

%Filter for horizontal and vertical direction

KGx = [-1, 0, 1; -2, 0, 2; -1, 0, 1];

KGy = [1, 2, 1; 0, 0, 0; -1, -2, -1];

%Convolution by image by horizontal and vertical filter

Filtered_X = conv2(A, KGx, 'same');

Filtered_Y = conv2(A, KGy, 'same');

%Calculate directions/orientations

arah = atan2 (Filtered_Y, Filtered_X);

arah = arah*180/pi;

pan=size(A,1);

leb=size(A,2);

%Adjustment for negative directions, making all directions positive

for i=1:pan

for j=1:leb

if (arah(i,j)<0)

arah(i,j)=360+arah(i,j);

end;

end;

end;

arah2=zeros(pan, leb);

%Adjusting directions to nearest 0, 45, 90, or 135 degree

for i = 1 : pan

for j = 1 : leb

if ((arah(i, j) >= 0 ) && (arah(i, j) < 22.5) || (arah(i, j) >= 157.5) && (arah(i, j) < 202.5) || (arah(i, j) >= 337.5) && (arah(i, j) <= 360))

arah2(i, j) = 0;

elseif ((arah(i, j) >= 22.5) && (arah(i, j) < 67.5) || (arah(i, j) >= 202.5) && (arah(i, j) < 247.5))

arah2(i, j) = 45;

elseif ((arah(i, j) >= 67.5 && arah(i, j) < 112.5) || (arah(i, j) >= 247.5 && arah(i, j) < 292.5))

arah2(i, j) = 90;

elseif ((arah(i, j) >= 112.5 && arah(i, j) < 157.5) || (arah(i, j) >= 292.5 && arah(i, j) < 337.5))

arah2(i, j) = 135;

end;

end;

end;

figure, imagesc(arah2); colorbar;

%Calculate magnitude

magnitude = (Filtered_X.^2) + (Filtered_Y.^2);

magnitude2 = sqrt(magnitude);

BW = zeros (pan, leb);

%Non-Maximum Supression

for i=2:pan-1

for j=2:leb-1

if (arah2(i,j)==0)

BW(i,j) = (magnitude2(i,j) == max([magnitude2(i,j), magnitude2(i,j+1), magnitude2(i,j-1)]));

elseif (arah2(i,j)==45)

BW(i,j) = (magnitude2(i,j) == max([magnitude2(i,j), magnitude2(i+1,j-1), magnitude2(i-1,j+1)]));

elseif (arah2(i,j)==90)

BW(i,j) = (magnitude2(i,j) == max([magnitude2(i,j), magnitude2(i+1,j), magnitude2(i-1,j)]));

elseif (arah2(i,j)==135)

BW(i,j) = (magnitude2(i,j) == max([magnitude2(i,j), magnitude2(i+1,j+1), magnitude2(i-1,j-1)]));

end;

end;

end;

BW = BW.*magnitude2;

figure, imshow(BW);

%Hysteresis Thresholding

T_Low = T_Low * max(max(BW));

T_High = T_High * max(max(BW));

T_res = zeros (pan, leb);

for i = 1 : pan

for j = 1 : leb

if (BW(i, j) < T_Low)

T_res(i, j) = 0;

elseif (BW(i, j) > T_High)

T_res(i, j) = 1;

%Using 8-connected components

elseif ( BW(i+1,j)>T_High || BW(i-1,j)>T_High || BW(i,j+1)>T_High || BW(i,j-1)>T_High || BW(i-1, j-1)>T_High || BW(i-1, j+1)>T_High || BW(i+1, j+1)>T_High || BW(i+1, j-1)>T_High)

T_res(i,j) = 1;

end;

end;

end;

edge_final = uint8(T_res.*255);

%Show final edge detection result

figure, imshow(edge_final);

第二个代码:

function [eout, dx, dy] = canny_edge(image_scan, smoothing_kernel, derivative_kernel)

thresh = [0.2 0.5];

sigma = sqrt(2);

thinning = true;

H = [];

kx = 1;

ky = 1;

[m,n] = size(image_scan);

e = false(m,n);

% Magic numbers

PercentOfPixelsNotEdges = .7; % Used for selecting thresholds

ThresholdRatio = .4; % Low thresh is this fraction of the high.

dx = imfilter(image_scan, smoothing_kernel', 'conv', 'replicate');

dx = imfilter(dx, derivative_kernel, 'conv', 'replicate');

% Compute smoothed numerical gradient of image I along y (vertical)

% direction. GY corresponds to dG/dy, where G is the Gaussian Smoothed

% version of image I.

dy = imfilter(image_scan, smoothing_kernel, 'conv', 'replicate');

dy = imfilter(dy, derivative_kernel', 'conv', 'replicate');

% Calculate Magnitude of Gradient

magGrad = hypot(dx, dy);

% Normalize for threshold selection

magmax = max(magGrad(:));

if magmax > 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值