如何应对光照变化
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 的非常低的值开始?
我正在尝试使用彩色图像检测天然树冠中的绿色柑橘类水果。
对于下图,
应用以下过程时,我得到以下结果。
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 的非常低的值开始?