如何应对光照变化

how to deal with illumination change

我正在尝试使用彩色图像检测天然树冠中的绿色柑橘类水果。

对于下图,

应用以下过程时,我得到以下结果。

image_gray = rgb2gray(image);

strel_erode = strel('disk', 10);
image_erode = imerode(image_gray, strel_erode);
figure, imshow(image_erode);

grayimage = image_erode;
for i = 1:768
    for j = 1:1024
        if(grayimage(i,j) > 100)
            grayimage(i,j) = 255;
        else
            grayimage(i,j) = 0;
        end
    end
end
figure, imshow(grayimage);

这个结果暂时不好,因为我是图像处理的新手。根据我的说法,我需要处理这张图片的光照变化。 如果我不在正确的轨道上,请指导和帮助我。

这里有一些提示:matlab 在循环时非常慢。如果我们想要快速处理,我们使用 "vectorized" 形式的方程。所以我们可以替换所有这些代码

for i = 1:768
    for j = 1:1024
        if(grayimage(i,j) > 100)
            grayimage(i,j) = 255;
        else
            grayimage(i,j) = 0;
        end
     end
end

有了这个

bw_image = (grayimage > 100);

这样做是为了创建二进制图像。如果该值 > 100,则为 true=1;它 <=100 它的假=0。这样速度更快,更易于阅读,并且无论图像大小如何,它都可以工作。

如果您不熟悉它,可以将图像转换为 HSV colorspace,而不是使用照明,它将 RGB 值转换为色调(颜色)、饱和度(颜色的鲜艳程度)、 〜亮度(照明水平)。这样做的好处是您可以在所有照明条件下寻找相同的颜色,这正是您想要的。自己看一下,在matlab中做

hsv_image = rgb2hsv(image);
imtool(hsv_image);

这将打开一个 window 让您检查像素值。颜色会很奇怪,这是因为 matlab 期望图像是 RGB 值而不是 HSV。所以它仍然绘制它,但颜色很奇怪。没关系,在 window 的左下角显示 "Pixel info (x,y) [H S V]"

如果您观察水果中的不同像素,您会发现它们都具有相似的色调值 ~.22,即使在阴影中也是如此!!你会注意到阴影中的 V 值很低,但在其他地方却很高。使用 HSV 你的新面具可能是这样的

bw_image = (hsv_image(:,:,1) >=.2 & hsv_image(:,:,1) <=.23);

如果您的图像是 m,n 像素(在您的例子中是 768,1024),则 HSV 彩色图像是 m,n,3 矩阵。其中 3 表示一层 1 是色调,2 是饱和度,3 是照明度。在符号 hsv_image(:,:,1) 中,冒号 : 表示 all 所以它表示获取第 1 层(色调)的所有行、所有列.

现在的一个问题是,这将检测图像中的所有绿色,甚至是背景中的那些树叶。但是当我们想忽略光照变化

时,HSV colorspace还是很有帮助的

使用 HSV 颜色 space 和其他人发布的分割文章将帮助您入门

编辑

一个小代码来告诉你图像的色调值是什么

hsv_im=rgb2hsv(im);      %converts image to HSV
imshow(hsv_im(:,:,1));   %displays only the hue channel/layer
colormap(hsv)            %uses the hue colormap
colorbar                 %displays the colorbar

您提到您已经尝试过霍夫圆变换。我的猜测是,这将 - 至少在您显示的阈值图像中 - 会相当有效,虽然水果的左侧部分被阴影模糊了。您是否尝试过提供对圆半径范围的合理估计,尤其是改变灵敏度,最好从 imfindcircles 的非常低的值开始?