提取Canny边缘

提取Canny边缘

# 加载原始图片,这里你也可以使用自己的图片
original_image = load_image("https://ice.frostsky.com/2023/08/26/2c809fbfcb030dd8a97af3759f37ee29.png").convert('RGB')

# 提取Canny边缘
image = np.array(original_image)
image = cv2.Canny(image, 100, 200)
image = image[:, :, None]
image = np.concatenate([image, image, image], axis=2)
image = Image.fromarray(image)

代码解释
以上代码的功能是加载一张原始图片,然后使用OpenCV中的Canny边缘检测算法对图片进行边缘提取。首先,将原始图片转换为NumPy类型的数组,然后使用cv2.Canny函数设置低阈值和高阈值进行边缘检测。接着,将得到的二维边缘图像转换为RGB格式,以便后续处理或显示。最后,将处理后的图像转换为Image对象,方便进一步操作或展示。

Canny边缘检测算法是一种经典的边缘检测算法,其主要步骤包括: 1. 高斯滤波:对图像进行高斯滤波,以去除噪声。 2. 计算梯度:对滤波后的图像进行梯度计算,以获取图像中每个像素的边缘强度和方向。 3. 非极大值抑制:对梯度图像进行非极大值抑制,以去除边缘中的非极大值点。 4. 双阈值检测:根据用户设定的两个阈值,将梯度图像中的像素分为强边缘、弱边缘和噪声三类,并将强边缘作为最终的边缘。 Matlab中可以通过以下代码实现Canny边缘检测: ```matlab % 读取图像 img = imread('lena.jpg'); % 高斯滤波 sigma = 1.5; % 高斯核标准差 H = fspecial('gaussian', [5 5], sigma); img_smooth = imfilter(img, H); % 计算梯度 [Gx, Gy] = gradient(double(img_smooth)); grad_mag = sqrt(Gx.^2 + Gy.^2); grad_dir = atan2(Gy, Gx) * 180 / pi; % 非极大值抑制 grad_nms = zeros(size(grad_mag)); for i = 2:size(grad_mag, 1)-1 for j = 2:size(grad_mag, 2)-1 if grad_dir(i,j) >= -22.5 && grad_dir(i,j) < 22.5 % 水平 if grad_mag(i,j) >= grad_mag(i,j-1) && grad_mag(i,j) >= grad_mag(i,j+1) grad_nms(i,j) = grad_mag(i,j); end elseif grad_dir(i,j) >= 22.5 && grad_dir(i,j) < 67.5 % 45度 if grad_mag(i,j) >= grad_mag(i-1,j-1) && grad_mag(i,j) >= grad_mag(i+1,j+1) grad_nms(i,j) = grad_mag(i,j); end elseif grad_dir(i,j) >= -67.5 && grad_dir(i,j) < -22.5 % -45度 if grad_mag(i,j) >= grad_mag(i-1,j+1) && grad_mag(i,j) >= grad_mag(i+1,j-1) grad_nms(i,j) = grad_mag(i,j); end else % 垂直 if grad_mag(i,j) >= grad_mag(i-1,j) && grad_mag(i,j) >= grad_mag(i+1,j) grad_nms(i,j) = grad_mag(i,j); end end end end % 双阈值检测 T1 = 0.1 * max(grad_nms(:)); T2 = 0.2 * max(grad_nms(:)); grad_thres = zeros(size(grad_nms)); grad_thres(grad_nms >= T2) = 1; for i = 2:size(grad_nms, 1)-1 for j = 2:size(grad_nms, 2)-1 if grad_nms(i,j) >= T1 && grad_nms(i,j) < T2 if grad_nms(i-1,j-1) >= T2 || grad_nms(i-1,j) >= T2 || grad_nms(i-1,j+1) >= T2 || grad_nms(i,j-1) >= T2 || grad_nms(i,j+1) >= T2 || grad_nms(i+1,j-1) >= T2 || grad_nms(i+1,j) >= T2 || grad_nms(i+1,j+1) >= T2 grad_thres(i,j) = 1; end end end end % 显示结果 figure; subplot(1,2,1); imshow(img); title('原始图像'); subplot(1,2,2); imshow(grad_thres); title('边缘检测结果'); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值