1

我试图隔离和分割黄色车身以改变它的颜色。为此,我需要从图像中分别识别身体。并继续使用剩余的白色像素进行演说。我使用 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 填充孔图像过滤器,但没有对阈值图像进行重大更改。我尝试使用滤色器,但由于身体的颜色变化,我没有返回正确的输出。任何人都可以为此提出建议和解决方案吗?

原始图像

原始图像

阈值图像

阈值图像

4

4 回答 4

2

您可能想要研究聚类,而不是阈值。

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

亮度调整 = 图像[地图[#^{1, 1, 0.2} &, ImageData[ColorConvert[img, "HSB"]], {2}], ColorSpace -> "HSB"]

在此处输入图像描述

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

(clusters = ClusteringComponents[ColorConvert[brightnessAdjusted, "RGB"], 3, Method -> "KMeans"]) // 着色

在此处输入图像描述

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

Image[MapThread[If[#1 == 2, #2[[{1, 3, 2}]], #2] &, {clusters, ImageData[brightnessAdjusted]}, 2]]

在此处输入图像描述

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

于 2011-11-15T12:11:13.210 回答
0

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

于 2011-11-15T00:14:08.023 回答
0
    I=imread('test.jpg'); 
    I=im2double(rgb2gray(I)); 
    BW=im2bw(I,0.64);imshow(BW)

给我 :

图片

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

于 2012-12-09T00:26:32.403 回答
0

如果要使用一组阈值,最好在 Hue Saturation Value colorspace中选择黄色色调。请参阅相关的SO 问题

于 2011-11-15T11:18:30.410 回答