如何规范化获取单一颜色的颜色?

时间:2018-06-17 16:08:33

标签: python image-processing

我必须构建一个算法,该算法采用RBG图像并将图像转换为木质马赛克。为此,我得到了一些木片样品,如下图所示:

samples

我想知道如何将每个平板电脑的颜色标准化,从而产生单一颜色,因此我可以构建一个参考颜色的地图,以将输入图像颜色转换为。

我已经搜索了如何实现这一目标,但我只找到了Wikipedia article,但我对此无法理解。

提前感谢您提供给我的所有帮助。

PS:我考虑使用Python来开发它。所以如果你想出一些使用这种语言的东西,我真的很感激。

3 个答案:

答案 0 :(得分:2)

获得平均颜色的方法是简单地取RGB值的平均值。

要获得更准确的平均值,您应该使用线性颜色值。通常RGB使用伽马校正值,但您可以轻松撤消它,然后在获得平均值后重做它。以下是使用Python的2.5版本的Python PIL的方法:

def average_color(sample):
    pix = sample.load()
    totals = [0.0, 0.0, 0.0]
    for y in range(sample.size[1]):
        for x in range(sample.size[0]):
            color = pix[x,y]
            for c in range(3):
                totals[c] += color[c] ** 2.2
    count = sample.size[0] * sample.size[1]
    color = tuple(int(round((totals[c] / count) ** (1/2.2))) for c in range(3))
    return color

对于示例左上角的示例,结果为(144,82,66)。这是所有这些的视觉效果:

enter image description here enter image description here

答案 1 :(得分:0)

要使一个颜色代表一个图块,一个简单的选项就是找到特定图块中随机像素样本的平均颜色。您可以选择合适的样本量作为速度和准确度之间的权衡。

对于您的特定用例,我建议进一步划分瓷砖,比如3 (因为大多数木板的从上到下的设计)。找出每列的平均颜色,并消除任何超出某种方差的方法。这是为了确保第4行中最右边的图块不会映射到较暗的阴影。

另一种方法是将输入图像和这些木质瓷砖转换为灰度并进行处理。 opencv库具有RGB2GRAY次转化的各种简单功能。

答案 2 :(得分:0)

标准化颜色的一个简单方法是简单地强制所有图像中RGB值的均值和标准差相同。

以下是示例图像中左侧列顶部的两个面板的示例。我将MATLAB与DIPimage 3.0一起使用,因为这是我所知道的,但这对于在Python中使用NumPy或任何其他所需的语言/库来实现是微不足道的:

img = readim('https://i.stack.imgur.com/HK6VY.png')
tab1 = dipcrop; % Interactive cropping of a tile from the displayed image
tab2 = dipcrop;

m1 = mean(tab1);
s1 = std(tab1);
m2 = mean(tab2);
s2 = std(tab2);
tab2b = (tab2 - m2) ./ s2 .* s1 + m1;

the three images: tab1, tab2 and tab2b

代码对图像tab2的作用是在每个通道的基础上减去平均值并除以标准偏差。接下来,它将每个通道乘以模板图像的相应通道的标准偏差,并添加该通道的平均值。