《数字图像处理与机器视觉》案例(五) ---基于傅里叶变换和的数学形态学的水果彩色图像边缘提取方法
CSDN 2024-09-04 17:31:01 阅读 62
一、简介
基于傅里叶变换和数学形态学的水果边缘提取方法结合了频域分析和形态学处理的优点,能够有效地提取水果图像中的边缘信息。通过高通滤波增强边缘和利用形态学算子细化边缘,该方法能够较好实现水果图像的边缘提取,为后续的水果图像识别和分析提供有力支持。
二、程序代码
clear all; % 清除所有变量
close all; % 关闭所有图形窗口
clc; % 清屏
imtool close all; % 关闭图像工具箱的所有窗口
I=imread('fruit1.jpg');
Igray=rgb2gray(I);
img = imread('fruit1.jpg'); % 读取图像
[m n d]=size(img);
imtool(img); % 打开图像工具箱进行图像分析
imgR = img(:,:,1); % 读取R通道分量
imgG = img(:,:,2); % 读取G通道分量
imgB = img(:,:,3); % 读取B通道分量
imgRB = imgR - imgB;
figure, imshow(imgRB);
img = imgRB;
% 步骤 1: 转换图像到频域
F = fft2(double(img));
Fshift = fftshift(F); % 将零频率分量移到频谱中心
% 步骤 2: 创建一个高通圆形滤波器
[rows, cols] = size(Fshift);
%D0 = 10; % 滤波器的截止频率,可以根据实际情况调整
D0 = 15; % 滤波器的截止频率,可以根据实际情况调整
[x, y] = meshgrid(-cols/2:cols/2-1, -rows/2:rows/2-1);
D = sqrt(x.^2 + y.^2);
H = double(D > D0); % 创建高通滤波器
% 应用高通滤波器
Fshift_filtered = Fshift .* H;
% 步骤 3: 将滤波后的图像从频域转换回空间域
img_filtered = ifftshift(Fshift_filtered);
img_edge = ifft2(img_filtered);
img_edge = real(img_edge); % 取实部
img_edge = uint8(abs(img_edge)); % 转换为8位无符号整数
% 显示滤波后的边缘图像
figure, imshow(img_edge, []), title('Edge Image by High-Pass Circular Filtering');
% 步骤 4: 图像的二值化数学形态学处理
%bw = im2bw(img_edge, 8/255);
bw = im2bw(img_edge, graythresh(img_edge));
bw = bwareaopen(bw, 2000); % 移除小目标
bw_fill = imfill(bw, 'holes');
figure, imshow(bw_fill);
%bw_fiil= bwareaopen(bw_fill, 2000000); % 再次移除小目标
%figure,imshow(bw_fill);
% 使用形态学开运算进一步处理图像
img_edge_final = bwmorph(bw_fill, 'remove'); % 注意此时直接使用bwmorph提取边缘效果更好!!!
figure, imshow(img_edge_final), title('Edge Image by High-Pass Circular Filtering and Mathematical Morphology');
% 显示处理后的边缘图像
figure, imshow(img_edge_final), title('Edge Image by High-Pass Circular Filtering and Mathematical Morphology');
% 步骤 5: 显示原始图像和结果
figure,
subplot(2,2,1), imshow(img), title('Original Image');
subplot(2,2,2), imshow(img_edge, []), title('Edge Image by High-Pass Circular Filtering');
subplot(2,2,3), imhist(img_edge), title('Edge Image Histogram');
subplot(2,2,4), imshow(img_edge_final), title('Edge Image by High-Pass Circular Filtering and Mathematical Morphology');
% 步骤 6: 计算和显示周长
edges = bwperim(img_edge_final);
stats = regionprops(edges, 'Centroid', 'Perimeter', 'BoundingBox');
% 显示带有周长标记的边缘图像
%figure,imshow(Igray);
%hold on;
figure,imshow(img_edge_final), title('Edge Image with Perimeter');
hold on;
for k = 1:length(stats)
centroid = stats(k).Centroid;
centroidOffset = centroid + [-20 -5];
thisBB = stats(k).BoundingBox;
textX = centroidOffset(1);
textY = centroidOffset(2);
plot(centroid(1), centroid(2), 'r+', 'MarkerSize', 10, 'Linewidth', 2);
text(textX, textY, sprintf('周长: %.1f', stats(k).Perimeter), ...
'HorizontalAlignment', 'left', ...
'VerticalAlignment', 'bottom', ...
'Color', 'yellow', 'FontSize', 10);
end
hold off;
三、主要运行结果
四、原始图像
如果你觉得本文对你的学习和研究有帮助,请关注,点赞和收藏,谢谢大家!
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。