《数字图像处理与机器视觉》案例(五) ---基于傅里叶变换和的数学形态学的水果彩色图像边缘提取方法

一、简介

      基于傅里叶变换和数学形态学的水果边缘提取方法结合了频域分析和形态学处理的优点,能够有效地提取水果图像中的边缘信息。通过高通滤波增强边缘和利用形态学算子细化边缘,该方法能够较好实现水果图像的边缘提取,为后续的水果图像识别和分析提供有力支持。

二、程序代码

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;

三、主要运行结果

   3ae20c5bd3e040dda7f78f05c68b3e10.png

四、原始图像

   be11c29a61484562a633c0df116a24f6.jpeg

如果你觉得本文对你的学习和研究有帮助,请关注,点赞和收藏,谢谢大家!

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值