canny算子代码
时间: 2023-07-02 19:05:49 浏览: 118
以下是Canny算子的Python实现代码:
```
import cv2
import numpy as np
def canny(image, sigma=0.33):
# 计算图像中的中位数
median = np.median(image)
# 计算低阈值和高阈值
lower = int(max(0, (1.0 - sigma) * median)))
upper = int(min(255, (1.0 + sigma) * median))
# 应用Canny算子
edged = cv2.Canny(image, lower, upper)
# 返回边缘图像
return edged
```
其中,`image`为输入的灰度图像,`sigma`为阈值调整系数。函数返回经过Canny算子处理后的边缘图像。
相关问题
Canny算子代码matlab代码
以下是Canny算子的Matlab代码示例:
```matlab
% 读取图像
img = imread('image.jpg');
% 转换为灰度图像
gray_img = rgb2gray(img);
% 应用高斯滤波器
gauss_img = imgaussfilt(gray_img, 1.5);
% 计算梯度幅值和方向
[grad_mag, grad_dir] = imgradient(gauss_img);
% 应用非极大值抑制
nms_img = imhmax(grad_mag, 0);
% 应用双阈值边缘检测
low_thresh = 0.1 * max(nms_img(:));
high_thresh = 0.2 * max(nms_img(:));
edge_img = edge(nms_img, 'canny', [low_thresh high_thresh]);
% 显示结果
imshow(edge_img);
```
注意,这只是一个简单的示例代码,您可能需要根据您的具体需求进行调整和修改。
Roberts算子、Prewitt算子、Sobel算子、Laplacian算子、Canny算子 代码python
以下是对应算子的简单示例代码:
Roberts算子:
```python
from scipy import ndimage
import numpy as np
def robert_cross(image):
roberts_cross_v = np.array( [[-1,0],[0,1]], dtype=np.int32 )
roberts_cross_h = np.array( [[0,-1],[1,0]], dtype=np.int32 )
vertical = ndimage.convolve( image, roberts_cross_v )
horizontal = ndimage.convolve( image, roberts_cross_h )
return np.sqrt( np.square(horizontal) + np.square(vertical) )
```
Prewitt算子:
```python
from scipy import ndimage
import numpy as np
def prewitt(image):
vert_prewitt = np.array([[-1,-1,-1],[0,0,0],[1,1,1]])
hori_prewitt = np.array([[-1,0,1],[-1,0,1],[-1,0,1]])
prewitt_vert = ndimage.convolve(image, vert_prewitt)
prewitt_hori = ndimage.convolve(image, hori_prewitt)
return np.sqrt( np.square(prewitt_vert) + np.square(prewitt_hori) )
```
Sobel算子:
```python
from scipy import ndimage
import numpy as np
def sobel(image):
vert_sobel = np.array([[-1,-2,-1],[0,0,0],[1,2,1]])
hori_sobel = np.array([[-1,0,1],[-2,0,2],[-1,0,1]])
sobel_vert = ndimage.convolve(image, vert_sobel)
sobel_hori = ndimage.convolve(image, hori_sobel)
return np.sqrt( np.square(sobel_vert) + np.square(sobel_hori) )
```
Laplacian算子:
```python
from scipy import ndimage
import numpy as np
def laplacian(image):
laplacian_kernal = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
filtered_img = ndimage.convolve(image, laplacian_kernal)
return filtered_img
```
Canny算子:
```python
from scipy import ndimage
import numpy as np
def canny(image, low_threshold=0, high_threshold=255):
img_smooth = ndimage.gaussian_filter(image, sigma=1.4)
img_x = ndimage.sobel(img_smooth, axis=0)
img_y = ndimage.sobel(img_smooth, axis=1)
gradient_magnitude = np.hypot(img_x, img_y)
gradient_direction = np.arctan2(img_y, img_x)
gradient_direction = np.rad2deg(gradient_direction)
gradient_direction[gradient_direction < 0] += 180
max_magnitude = np.max(gradient_magnitude)
if high_threshold > max_magnitude:
high_threshold = max_magnitude
if low_threshold > high_threshold:
low_threshold, high_threshold = high_threshold, low_threshold
row, col = image.shape
canny_img = np.zeros((row, col), dtype=np.uint8)
weak = np.int32(50)
strong = np.int32(255)
strong_i, strong_j = np.where(gradient_magnitude >= high_threshold)
zeros_i, zeros_j = np.where(gradient_magnitude < low_threshold)
weak_i, weak_j = np.where((gradient_magnitude <= high_threshold) & (gradient_magnitude >= low_threshold))
canny_img[strong_i, strong_j] = strong
canny_img[weak_i, weak_j] = weak
for i in range(1, row-1):
for j in range(1, col-1):
if canny_img[i,j] == weak:
if (canny_img[i+1, j-1] == strong) or (canny_img[i+1, j] == strong) or (canny_img[i+1, j+1] == strong) \
or (canny_img[i, j-1] == strong) or (canny_img[i, j+1] == strong) \
or (canny_img[i-1, j-1] == strong) or (canny_img[i-1, j] == strong) or (canny_img[i-1, j+1] == strong):
canny_img[i, j] = strong
else:
canny_img[i, j] = 0
return canny_img
```
阅读全文