% 读取图像 img = imread('C:\Users\zhoub\Desktop\258.png'); % 将图像转换为灰度图像 gray_img = rgb2gray(img); % 预处理图像(平滑和二值化) smooth_img = imgaussfilt(gray_img); bw_img = imbinarize(smooth_img); % 边缘检测 edge_img = edge(bw_img, 'Canny'); % 检测圆形硬币 [centers, radii] = imfindcircles(edge_img, [20 50]); % 去除噪声并填充硬币内部 se = strel('disk', 10); open_img = imopen(bw_img, se); fill_img = imfill(open_img, 'holes'); % 显示结果 figure; subplot(2,2,1); imshow(img); title('原图像'); subplot(2,2,2); imshow(bw_img); title('二值化图像'); subplot(2,2,3); imshow(edge_img); title('边缘检测图像'); subplot(2,2,4); imshow(img); hold on; viscircles(centers, radii, 'EdgeColor', 'b'); title('检测到的硬币'); % 检测铅笔 se = strel('line', 20, 90); erode_img = imerode(bw_img, se); dilate_img = imdilate(erode_img, se); filled_img = imfill(dilate_img, 'holes'); stats = regionprops(filled_img, 'Area', 'Perimeter', 'Eccentricity'); figure; imshow(img); hold on; for i=1:length(stats) if stats(i).Area > 500 && stats(i).Perimeter > 100 && stats(i).Eccentricity > 0.9 rectangle('Position', stats(i).BoundingBox, 'EdgeColor', 'r', 'LineWidth', 2); text(stats(i).BoundingBox(1), stats(i).BoundingBox(2)-20, '铅笔', 'Color', 'r', 'FontSize', 14); end end title('检测到的铅笔');
时间: 2023-11-26 17:06:02 浏览: 80
这段代码使用了 MATLAB 的图像处理工具箱,实现了对一张包含硬币和铅笔的图像的处理和识别。首先读入图像,然后将其转换为灰度图像,并进行平滑和二值化处理。接下来进行边缘检测,并用 imfindcircles 函数检测出图像中的圆形硬币。然后使用形态学处理去除噪声并填充硬币内部,最后在图像上显示检测到的硬币。接着,使用 strel 函数创建一个线形结构元素,用于检测铅笔。然后用 imerode 和 imdilate 函数对二值化后的图像进行腐蚀和膨胀操作,再用 imfill 函数填充铅笔内部。最后,使用 regionprops 函数计算区域的属性,并根据面积、周长和离心率等特征判断出铅笔并在图像上用矩形标出。
相关问题
将以下代码优化,只提取目标区域:% 读取图像 img = imread('fabric.jpg'); % 转为灰度图像 gray = rgb2gray(img); % 边缘检测 edgeImg = edge(gray, 'canny'); % 显示结果 imshow(edgeImg);
可以通过链式操作将代码优化,只提取目标区域:
```matlab
edgeImg = imread('fabric.jpg') % 读取图像
.rgb2gray() % 转为灰度图像
.edge('canny') % 边缘检测
.imshow(); % 显示结果
```
这样可以使代码更简洁易读。需要注意的是,这种链式操作需要使用 MATLAB 的扩展包,如 Image Processing Toolbox。
使用这段代码,为什么我想要得到的目标是黑色:% 读取图像 img = imread('瑕疵图像1.png'); % 将图像转换为灰度图像 gray_img = rgb2gray(img); % 设定阈值,一般可以通过试错法来确定最佳阈值 threshold = 107; % 对图像进行二值化处理,将灰度值大于阈值的像素点设为白色(255), 其余像素点设为黑色(0) binary_img = gray_img > threshold; % 对二值化后的图像进行形态学操作,去除噪声 se = strel('disk', 2); binary_img = imopen(binary_img, se); % 显示结果 figure; subplot(1, 2, 1); imshow(img); title('原图'); subplot(1, 2, 2); imshow(binary_img); title('提取结果');
如果想要得到的目标是黑色,可以将二值化处理的选项反转一下,即将大于阈值的像素点设为黑色(0),其余像素点设为白色(255)。修改后的代码如下:
```
% 读取图像
img = imread('瑕疵图像1.png');
% 将图像转换为灰度图像
gray_img = rgb2gray(img);
% 设定阈值,一般可以通过试错法来确定最佳阈值
threshold = 107;
% 对图像进行二值化处理,将灰度值大于阈值的像素点设为黑色(0),其余像素点设为白色(255)
binary_img = gray_img <= threshold;
% 对二值化后的图像进行形态学操作,去除噪声
se = strel('disk', 2);
binary_img = imopen(binary_img, se);
% 显示结果
figure;
subplot(1, 2, 1);
imshow(img);
title('原图');
subplot(1, 2, 2);
imshow(binary_img);
title('提取结果');
```
这样修改后,提取结果中,黑色像素点表示目标区域,白色像素点表示背景区域。
阅读全文