我试图用彩色图像检测天然檐篷中的绿色柑橘类水果。
对于下图,
在应用以下过程时,我得到以下结果。
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);
这个结果现在不能好,因为我是图像处理的新手。据我所知,我需要处理这张照片上的照明变化。 如果我没有走上正轨,请指导并帮助我。
答案 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]”
如果你看一下水果中的不同像素,你会发现它们都有相似的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
答案 1 :(得分:0)
你提到你已经尝试过hough circle transfrom。我的猜测是 - 至少在您显示的阈值图像中 - 会合理地工作,但是虽然水果的左侧部分被阴影混淆了。您是否尝试过对圆半径范围进行合理估计,尤其是 - 改变灵敏度,最好从imfindcircles的最低值开始?