使用阈值分割图像的一部分

时间:2011-11-14 21:32:54

标签: c# image-processing background-color image-segmentation threshold

我试图隔离并分割黄色车身以改变它的颜色。为了做到这一点,我需要从图像中分别识别身体。并继续使用剩余的白色像素进行演绎。我正在使用C#,这里是计划

Color d;
Color newColor = Color.YellowGreen;    
for(inti =0;i<carimage.Width;i++){
    for(intj =0;j<carimage.Height;j++){
        d = carimage.GetPixel(i, j);
            if(d.R == 255 && d.G==255 && d.B == 255)
                image.SetPixel(i, j, newColor );
    }
}

简单的阈值处理会使车身未正确分离的第二个图像。我尝试了Aforge.net填充孔图像过滤器,但没有对阈值图像进行重大更改。我试图使用滤色器,但由于机身的颜色不同,我没有返回正确的输出。任何人都可以建议和解决这个问题?

原始图像

original image

阈值图像

threshold image

4 个答案:

答案 0 :(得分:2)

您可能希望了解群集,而不是进行阈值处理。

作为快速和肮脏的测试,我增加了HSB空间中的图像亮度(使用Mathematica):

  

brightnessAdjusted =图片[     地图[#^ {1,1,0.2}&amp;,ImageData [ColorConvert [img,“HSB”]],{2}],     ColorSpace - &gt; “HSB”]

enter image description here

然后我使用了简单的K-Nearest聚类:

  

(clusters = ClusteringComponents [ColorConvert [brightnessAdjusted,“RGB”],3,       方法 - &gt; “KMeans”])//着色

enter image description here

在图像中找到相似颜色的簇(还有更多,可能更合适的聚类算法,所以你应该试验一下)。然后我可以调整其中一个集群中的颜色:

  

图像[MapThread [如果[#1 == 2,#2 [[{1,3,2}]],#2]&amp;,{clusters,ImageData [brightnessAdjusted]},2]]

enter image description here

如果你想使用阈值处理,你应该使用CIE color space,因为该颜色空间中的欧几里德距离更接近人类的感知。

答案 1 :(得分:0)

几年前我有一个类似的项目。我不记得确切的细节,但想法是在图像上移动一个(不是太小的)滑动窗口,并计算每个位置窗口内的平均强度(可能分别为R,G和B)。我用这些平均值填充“阈值图像”,并从原始图像中减去它。在某处有一个缩放因子,以及其他调整内容,但重点是,这种方法比使用恒定阈值更好。

答案 2 :(得分:0)

如果要使用一组阈值,最好选择色调饱和度值colorspace中的黄色色调。请参阅相关的SO question

答案 3 :(得分:0)

    I=imread('test.jpg'); 
    I=im2double(rgb2gray(I)); 
    BW=im2bw(I,0.64);imshow(BW)

给我:

image http://s10.postimage.org/izo0py7jd/Untitled.jpg

通过查看图像的直方图,我得到了0.64的阈值。我建议您使用MATLAB进行图像处理,因为它更容易。希望能帮助您为图像着色。