问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MATLAB数字图像处理:红苹果的目标与背景分割与提取

创作时间:
作者:
@小白创作中心

MATLAB数字图像处理:红苹果的目标与背景分割与提取

引用
CSDN
1.
https://blog.csdn.net/2202_75442297/article/details/145517544

在数字图像处理领域,目标与背景的分割是一项基础且重要的技术。本文将以红苹果的图像处理为例,详细介绍如何使用MATLAB实现目标与背景的分割与提取。通过本案例的学习,读者可以掌握图像消噪、目标分析、阈值分割等关键技术,并能够应用到实际的图像处理项目中。

主要要求

提取红苹果

建议方法

  1. 将已知图像进行消噪处理
  2. 对彩色图像进行目标和背景分析
  3. 通过阈值法将图像进行分割
  4. 提取目标

难点

  1. 确定目标区域的特征
  2. 边界修复与区域分割

实验结果

原始图像:展示了包含红苹果以及背景场景的原始画面,并且红苹果与背景的颜色、纹理等特征相互交织,不易直接区分。

整体上看,添加高斯噪声的图像会变得 “模糊” 且带有一些类似 “颗粒” 的效果,原本清晰的细节部分会被噪声干扰,看起来不再那么平滑和锐利,图像质量有所下降。

对添加高斯噪声后的图像的 RGB 三个通道分别进行高斯滤波,其主要目的是减少之前添加的高斯噪声对图像造成的干扰,尽可能恢复图像原本的清晰度和质量。整体来看,经过高斯滤波处理后的图像(即 denoisedImage)相较于添加噪声后的图像(noisyImage),视觉上会变得更加清晰和平滑,之前因噪声产生的那些 “颗粒感” 以及图像细节处的模糊现象会得到一定程度的改善。

提取的红苹果:最终提取出的红苹果图像以彩色形式呈现,其中苹果区域显示为原图像中的颜色,背景为黑色。整体上能够大致看出红苹果的形状和位置,但在苹果的边缘部分,尤其是与背景颜色过渡较为自然的区域,存在一些模糊和不精确的现象,这是由于边界修复不够完善以及区域分割不够精准导致的。

自行拍摄的图片添加椒盐噪声以及去噪之后的图像:

MATLAB代码实现

椒盐噪声处理

% 读取图像(确保图像文件名为apple.jpg且在当前Matlab工作目录下,或者给出完整路径)
image = imread('apple.jpg'); 

% 步骤一:添加椒盐噪声
% 设置椒盐噪声密度(可根据实际情况调整噪声强度,取值范围0到1)
noiseDensity = 0.02;
noisyImage = imnoise(image, 'salt & pepper', noiseDensity);

% 分离添加噪声后图像的RGB三个通道
noisyRedChannel = noisyImage(:, :, 1);
noisyGreenChannel = noisyImage(:, :, 2);
noisyBlueChannel = noisyImage(:, :, 3);

% 对每个通道分别进行中值滤波,使用3×3的滤波窗口(窗口大小可按需调整)
denoisedRedChannel = medfilt2(noisyRedChannel, [3 3]);
denoisedGreenChannel = medfilt2(noisyGreenChannel, [3 3]);
denoisedBlueChannel = medfilt2(noisyBlueChannel, [3 3]);

% 将滤波后的三个通道重新合并为彩色图像
denoisedImage = cat(3, denoisedRedChannel, denoisedGreenChannel, denoisedBlueChannel);

% 步骤二:将彩色图像从RGB空间转换为HSV空间
hsvImage = rgb2hsv(denoisedImage);

% 分离HSV三个通道
hue = hsvImage(:, :, 1);
saturation = hsvImage(:, :, 2);
value = hsvImage(:, :, 3);

% 步骤三:阈值法图像分割(调整合适的HSV阈值)
% 色相(Hue),进一步微调色相阈值范围,使其更贴合红苹果颜色特征
redHueLower = 0;
redHueUpper = 0.1;
redHueMask1 = (hue >= redHueLower) & (hue <= redHueUpper);
redHueLower = 0.9;
redHueUpper = 1;
redHueMask2 = (hue >= redHueLower) & (hue <= redHueUpper);
redHueMask = redHueMask1 | redHueMask2;

% 饱和度(Saturation),适当提高饱和度阈值,让苹果颜色更纯的区域被选中
saturationThreshold = 0.3;
saturationMask = saturation >= saturationThreshold;

% 明度(Value),根据图像实际亮度情况微调明度阈值
valueThreshold = 0.2;
valueMask = value >= valueThreshold;

% 综合三个通道的掩码得到分割掩码
segmentationMask = redHueMask & saturationMask & valueMask;

% 步骤四:目标提取
% 进行形态学开运算
se = strel('disk', 3);
openedMask = imopen(segmentationMask, se);

% 找到目标区域
[labeledImage, numRegions] = bwlabel(openedMask);

% 提取最大的连通区域作为红苹果
maxArea = 0;
maxLabel = 0;
for region = 1:numRegions
    currentRegion = labeledImage == region;
    area = sum(currentRegion(:));
    if area > maxArea
        maxArea = area;
        maxLabel = region;
    end
end

% 最终提取的红苹果目标图像
appleBinary = labeledImage == maxLabel;

imageDouble = im2double(image);

% 可以将二值图像转换回和原图像相同大小的彩色图像
extractedApple = zeros(size(image), 'double');  
extractedApple(:, :, 1) = imageDouble(:, :, 1).* appleBinary;
extractedApple(:, :, 2) = imageDouble(:, :, 2).* appleBinary;
extractedApple(:, :, 3) = imageDouble(:, :, 3).* appleBinary;

% 显示结果
subplot(2, 3, 1);
imshow(image);
title('原始图像');
subplot(2, 3, 2);
imshow(noisyImage);
title('添加椒盐噪声后的图像');
subplot(2, 3, 3);
imshow(denoisedImage);
title('中值滤波后图像');
subplot(2, 3, 4);
imshow(segmentationMask);
title('分割掩码');
subplot(2, 3, 5);
imshow(extractedApple);
title('提取的红苹果');

高斯噪声处理

image = imread('apple2.jpg'); 

% 步骤一:添加高斯噪声
% 设置高斯噪声的均值和标准差
meanValue = 0;
stdDeviation = 0.05;
noisyImage = imnoise(image, 'gaussian', meanValue, stdDeviation);

% 分离添加噪声后图像的RGB三个通道
noisyRedChannel = noisyImage(:, :, 1);
noisyGreenChannel = noisyImage(:, :, 2);
noisyBlueChannel = noisyImage(:, :, 3);

% 对每个通道分别进行高斯滤波,使用3×3的滤波窗口
% 生成高斯滤波器,标准差设为1
h = fspecial('gaussian', [3 3], 1); 
denoisedRedChannel = imfilter(noisyRedChannel, h, 'replicate');
denoisedGreenChannel = imfilter(noisyGreenChannel, h, 'replicate');
denoisedBlueChannel = imfilter(noisyBlueChannel, h, 'replicate');

% 将滤波后的三个通道重新合并为彩色图像
denoisedImage = cat(3, denoisedRedChannel, denoisedGreenChannel, denoisedBlueChannel);

% 步骤二:将彩色图像从RGB空间转换为HSV空间
hsvImage = rgb2hsv(denoisedImage);

% 分离HSV三个通道
hue = hsvImage(:, :, 1);
saturation = hsvImage(:, :, 2);
value = hsvImage(:, :, 3);

% 步骤三:阈值法图像分割
% 色相(Hue)
redHueLower = 0;
redHueUpper = 0.12;
redHueMask1 = (hue >= redHueLower) & (hue <= redHueUpper);
redHueLower = 0.8;
redHueUpper = 1;
redHueMask2 = (hue >= redHueLower) & (hue <= redHueUpper);
redHueMask = redHueMask1 | redHueMask2;

% 饱和度(Saturation)
saturationThreshold = 0.3;
saturationMask = saturation >= saturationThreshold;

% 明度(Value)
valueThreshold = 0.2;
valueMask = value >= valueThreshold;

% 综合三个通道的掩码得到分割掩码
segmentationMask = redHueMask & saturationMask & valueMask;

% 步骤四:目标提取
% 进行形态学开运算
se = strel('disk', 3);
openedMask = imopen(segmentationMask, se);

% 找到目标区域
[labeledImage, numRegions] = bwlabel(openedMask);

% 提取最大的连通区域作为红苹果
maxArea = 0;
maxLabel = 0;
for region = 1:numRegions
    currentRegion = labeledImage == region;
    area = sum(currentRegion(:));
    if area > maxArea
        maxArea = area;
        maxLabel = region;
    end
end

% 最终提取的红苹果目标图像
appleBinary = labeledImage == maxLabel;

imageDouble = im2double(image);

% 可以将二值图像转换回和原图像相同大小的彩色图像
extractedApple = zeros(size(image), 'double');  
extractedApple(:, :, 1) = imageDouble(:, :, 1).* appleBinary;
extractedApple(:, :, 2) = imageDouble(:, :, 2).* appleBinary;
extractedApple(:, :, 3) = imageDouble(:, :, 3).* appleBinary;

% 显示结果
subplot(2, 3, 1);
imshow(image);
title('原始图像');
subplot(2, 3, 2);
imshow(noisyImage);
title('添加高斯噪声后的图像');
subplot(2, 3, 3);
imshow(denoisedImage);
title('高斯滤波后图像');
subplot(2, 3, 4);
imshow(segmentationMask);
title('分割掩码');
subplot(2, 3, 5);
imshow(extractedApple);
title('提取的红苹果');
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号