如何应对光照变化

时间:2015-03-25 19:22:30

标签: matlab image-processing

我试图用彩色图像检测天然檐篷中的绿色柑橘类水果。

对于下图,

enter image description here

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

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);

enter image description here

这个结果现在不能好,因为我是图像处理的新手。据我所知,我需要处理这张照片上的照明变化。 如果我没有走上正轨,请指导并帮助我。

2 个答案:

答案 0 :(得分:2)

以下是一些提示:matlab循环非常慢。如果我们想要快速处理,我们使用“矢量化”方程式。所以我们可以替换所有这些代码

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它是真的= 1;它的< = 100,其假= 0。这样更快,更容易阅读,无论图像大小如何都可以使用。

如果你不熟悉它,你可以将图像转换为HSV colorspace,而不是使用照明,它可以将RGB值转换为Hue(颜色),饱和度(颜色有多生动),〜亮度(照度级)。关于这一点的好处是你可以在所有光照条件下寻找相同的颜色,这正是你想要的。亲自看看,在matlab中做

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

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

enter image description here

如果你看一下水果中的不同像素,你会发现它们都有相似的Hue值〜.22即使在阴影中!你会注意到阴影中的V值很低,但在其他地方它很高。使用HSV你的新面具可能是这样的

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

如果您的图像是m,n像素(在您的情况下为768,1024),则HSV彩色图像为m,n,3矩阵。其中3表示一层1是Hue,2表示饱和,3表示照明。在符号hsv_image(:,:,1)中,冒号表示全部,因此它表示获取第1层(色调)的所有行,所有列。

现在的一个问题是,这将检测图像中的所有绿色,甚至是背景中的那些叶子。但是当我们想要忽略光照变化时,HSV色彩空间仍然非常有用

使用HSV色彩空间和其他人发布的细分文章将帮助您入门

修改

一些代码,用于显示图像的色调值

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

enter image description here

答案 1 :(得分:0)

你提到你已经尝试过hough circle transfrom。我的猜测是 - 至少在您显示的阈值图像中 - 会合理地工作,但是虽然水果的左侧部分被阴影混淆了。您是否尝试过对圆半径范围进行合理估计,尤其是 - 改变灵敏度,最好从imfindcircles的最低值开始?