代码 sobel_h = [-1 0 1; -2 0 2; -1 0 1]; sobel_v = sobel_h'; edge_h = imfilter(smooth_img, sobel_h); edge_v = imfilter(smooth_img, sobel_v); edge_img = sqrt(edge_h.^2 + edge_v.^2); 未定义与 'uint8' 类型的输入参数相对应的函数 'sqrt'。运行后显示未定义与 'uint8' 类型的输入参数相对应的函数 'sqrt'。
时间: 2024-03-10 20:49:26 浏览: 128
这个错误是因为在计算边缘图像时,您使用了 `sqrt` 函数,但是输入的图像类型是 `uint8`,不支持该函数。您需要将图像类型转换为 `double` 或 `single`,然后再进行计算。可以使用以下代码将图像类型转换为 `double` 类型:
```
smooth_img = im2double(smooth_img);
```
或者在计算边缘图像时,可以使用 `im2single` 函数将图像类型转换为 `single` 类型:
```
edge_img = sqrt(single(edge_h).^2 + single(edge_v).^2);
```
注意:转换图像类型可能会导致图像信息的损失,所以在进行转换之前需要谨慎考虑。
相关问题
clc;clear all; img = imread('C:\Users\210\Desktop\123\mouse.jpg'); figure; imshow(img),title("原图像"); [ROW,COL] = size(img); img = double(img); new_img = zeros(ROW,COL); %新建画布 %定义robert算子 roberts_x = [1,0;0,-1]; roberts_y = [0,-1;1,0]; for i = 1:ROW - 1 for j = 1:COL - 1 funBox = img(i:i+1,j:j+1); G_x = roberts_x .* funBox; G_x = abs(sum(G_x(:))); G_y = roberts_y .* funBox; G_y = abs(sum(G_y(:))); roberts_xy = G_x * 0.5 + G_y * 0.5; new_img(i,j) = roberts_xy; end end figure(2); imshow(new_img/255),title("robert算子的图像"); % 定义laplace算子 laplace = [0,1,0;1,-4,1;0,1,0]; for i = 1:ROW - 2 for j = 1:COL - 2 funBox = img(i:i+2,j:j+2); G = laplace .* funBox; G = abs(sum(G(:))); new_img(i+1,j+1) = G; end end figure(3) imshow(new_img/255),title("laplace算子的图像"); %定义sobel算子 sobel_x = [-1,0,1;-2,0,2;-1,0,1]; sobel_y = [-1,-2,-1;0,0,0;1,2,1]; for i = 1:ROW - 2 for j = 1:COL - 2 funBox = img(i:i+2,j:j+2); G_x = sobel_x .* funBox; G_x = abs(sum(G_x(:))); G_y = sobel_y .* funBox; G_y = abs(sum(G_y(:))); sobelxy = G_x * 0.5 + G_y * 0.5; new_img(i+1,j+1) = sobelxy; end end figure(4); imshow(new_img/255),title("sobel的图像"); %定义Prewitt算子 sobel_x = [-1,0,1;-1,0,1;-1,0,1]; sobel_y = [-1,-1,-1;0,0,0;1,1,1]; for i = 1:ROW - 2 for j = 1:COL - 2 funBox = img(i:i+2,j:j+2); G_x = sobel_x .* funBox; G_x = abs(sum(G_x(:))); G_y = sobel_y .* funBox; G_y = abs(sum(G_y(:))); sobelxy = G_x * 0.5 + G_y * 0.5; new_img(i+1,j+1) = sobelxy; end end figure(5); imshow(new_img/255),title("Prewitt的图像");
这段代码中有一行 `img = imread('C:\Users\210\Desktop\123\mouse.jpg');`,你需要注意到这行代码中的路径字符串包含一个隐藏字符,可能导致 `imread` 函数无法正确读取图像文件。你可以尝试重新输入路径字符串,或者将其复制到一个新的文本编辑器中,然后再复制回代码中,确保字符串不包含任何隐藏字符。另外,你的代码中有多个嵌套的循环,如果图像比较大,处理速度可能会比较慢。你可以尝试使用 MATLAB 自带的图像处理函数,比如 `imfilter`、`edge` 等,来优化算法实现。
如果要等价实现下列代码,应该如何更改def edge_detection(image, type): if type == 'roberts': roberts_x = np.array([[-1, 0], [0, 1]]) roberts_y = np.array([[0, -1], [1, 0]]) # roberts 算子计算x和y方向的梯度 gradient_x_roberts = cv2.filter2D(image, -1, roberts_x) gradient_y_roberts = cv2.filter2D(image, -1, roberts_y) edges_roberts = cv2.add(np.abs(gradient_x_roberts), np.abs(gradient_y_roberts)) edges_roberts = np.uint8(edges_roberts) return edges_roberts elif type == 'prewitt': prewitt_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]]) prewitt_y = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]]) # prewitt 算子计算x和y方向的梯度 gradient_x_prewitt = cv2.filter2D(image, -1, prewitt_x) gradient_y_prewitt = cv2.filter2D(image, -1, prewitt_y) edges_prewitt = cv2.add(np.abs(gradient_x_prewitt), np.abs(gradient_y_prewitt)) edges_prewitt = np.uint8(edges_prewitt) return edges_prewitt elif type == 'sobel': # Sobel算子 sobel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]) sobel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]) # Sobel 算子计算x和y方向的梯度 gradient_x_sobel = cv2.filter2D(image, -1, sobel_x) gradient_y_sobel = cv2.filter2D(image, -1, sobel_y) edges_sobel = cv2.add(np.abs(gradient_x_sobel), np.abs(gradient_y_sobel)) edges_sobel = np.uint8(edges_sobel) return edges_sobel elif type == 'canny': edges = cv2.Canny(image, threshold1=50, threshold2=100) return edges else: raise NotImplementedError
为了实现等价功能,可以使用下列代码:
```python
def edge_detection(image, type):
if type == 'roberts':
roberts_x = np.array([[-1, 0], [0, 1]])
roberts_y = np.array([[0, -1], [1, 0]])
gradient_x_roberts = conv2d(image, roberts_x)
gradient_y_roberts = conv2d(image, roberts_y)
edges_roberts = np.abs(gradient_x_roberts) + np.abs(gradient_y_roberts)
edges_roberts = np.uint8(edges_roberts)
return edges_roberts
elif type == 'prewitt':
prewitt_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]])
prewitt_y = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]])
gradient_x_prewitt = conv2d(image, prewitt_x)
gradient_y_prewitt = conv2d(image, prewitt_y)
edges_prewitt = np.abs(gradient_x_prewitt) + np.abs(gradient_y_prewitt)
edges_prewitt = np.uint8(edges_prewitt)
return edges_prewitt
elif type == 'sobel':
sobel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
sobel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
gradient_x_sobel = conv2d(image, sobel_x)
gradient_y_sobel = conv2d(image, sobel_y)
edges_sobel = np.abs(gradient_x_sobel) + np.abs(gradient_y_sobel)
edges_sobel = np.uint8(edges_sobel)
return edges_sobel
elif type == 'canny':
edges = cv2.Canny(image, threshold1=50, threshold2=100)
return edges
else:
raise NotImplementedError
```
主要的改动在于使用了自定义的 `conv2d` 函数替换了原来的 `cv2.filter2D` 函数。由于 `cv2.filter2D` 函数的实现方式与 `conv2d` 函数有所不同,因此替换后需要重新计算梯度,并对梯度进行绝对值处理和类型转换。
阅读全文