我必须构建一个算法,该算法采用RBG图像并将图像转换为木质马赛克。为此,我得到了一些木片样品,如下图所示:
我想知道如何将每个平板电脑的颜色标准化,从而产生单一颜色,因此我可以构建一个参考颜色的地图,以将输入图像颜色转换为。
我已经搜索了如何实现这一目标,但我只找到了Wikipedia article,但我对此无法理解。
提前感谢您提供给我的所有帮助。
PS:我考虑使用Python来开发它。所以如果你想出一些使用这种语言的东西,我真的很感激。
答案 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)。这是所有这些的视觉效果:
答案 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;
代码对图像tab2
的作用是在每个通道的基础上减去平均值并除以标准偏差。接下来,它将每个通道乘以模板图像的相应通道的标准偏差,并添加该通道的平均值。