是否有工具将图片转换为RGB“点”

时间:2017-12-01 05:24:47

标签: image-processing colors

我正在尝试向学生展示RGB颜色模型如何工作以创建特定颜色(或者更确切地说服它们确实如此)。所以我想拍照并将每个像素转换为RGB表示,这样当你放大时,你会看到RGB颜色而不是单个彩色像素。

我已经完成了这个但是由于一些非常明显的原因,转换后的图片要么被淘汰,要么比原来更暗(这是一个小小的不便,但我认为如果我能让它更像是原)。

这是两张“缩小”的图片: Liko Zoomed Out

这是一个“中等缩放”,开始在转换后的图片中显示RGB瑕疵:

Like Medium Zoom

这是一张照片,放大到可以清楚地看到RGB像素的单个像素

Like Zoome In

你会注意到像素周围的恒定颜色;这是图片的平均RGB。我把它放在那里你可以看到单个像素(否则你只看到红色/绿色/蓝色阴影的行/列)。如果我完全取出那个空间,图像会更暗,如果我用白色替换它,那么图像看起来就会褪色(当缩小时)。

我知道为什么以这种方式显示它会变暗:“纯红色”将带有完全黑色的蓝色和绿色。从某种意义上说,如果我要拍一张完全红色的照片,它的亮度基本上是原始照片的1/3。

所以我的问题是:

1:是否有可用的工具(或类似的东西)?

2:关于如何使转换后的图像更接近原始图像的任何想法?

对于第二个问题,我当然可以增加每个“RGB像素”(每个方块中的三个水平条纹)的亮度,但是增加了多少?我当然不能将RGB整数乘以3(对于我上面所述的表观补偿)。我想知道是否有某种方法来调整我的背景颜色以补偿我?或者它只是需要为每张照片摆弄?

3 个答案:

答案 0 :(得分:3)

你认为你可以通过将所有东西乘以3来保持亮度是正确的。只有一个小问题:图像中的RGB值使用伽马校正,因此强度不是线性的。您需要对值进行去伽马,乘以,然后再次对其进行伽马校正。

您还需要丢失每个像素周围的边框。这些边界占据了最终图像的7/16,这太过于无法弥补。我尝试将每隔一个像素旋转90度,虽然它给结果一个明确的锯齿形图案,但它确实清楚了像素边界的位置。

在图像查看器中缩小时,您可能也会看到伽玛问题。许多观众在调整大小时都不愿意进行伽马校正。有关详细说明,请参阅Gamma error in picture scaling,并使用最后提供的测试图像。完全放弃扩展并简单地退出监视器可能会更好。

这是一些Python代码和结果图像中的裁剪。

from PIL import Image
im = Image.open(filename)
im2 = Image.new('RGB', (im.size[0]*3, im.size[1]*3))
ld1 = im.load()
ld2 = im2.load()
for y in range(im.size[1]):
    for x in range(im.size[0]):
        rgb = ld1[x,y]
        rgb = [(c/255)**2.2 for c in rgb]
        rgb = [min(1.0,c*3) for c in rgb]
        rgb = tuple(int(255*(c**(1/2.2))) for c in rgb)
        x2 = x*3
        y2 = y*3
        if (x+y) & 1:
            for x3 in range(x2, x2+3):
                ld2[x3,y2] = (rgb[0],0,0)
                ld2[x3,y2+1] = (0,rgb[1],0)
                ld2[x3,y2+2] = (0,0,rgb[2])
        else:
            for y3 in range(y2, y2+3):
                ld2[x2,y3] = (rgb[0],0,0)
                ld2[x2+1,y3] = (0,rgb[1],0)
                ld2[x2+2,y3] = (0,0,rgb[2])

enter image description here

答案 1 :(得分:2)

不要在这上面浪费那么多时间。如果其中一个图像中的信息较少,则无法使两个图像看起来相同。在缩小时,您的计算机仍会以奇怪的方式对图像进行二次采样。

只需在课堂上放一个放大镜,这样他们就可以在手机或其他屏幕上看到自己,或者以不同的放大倍数显示屏幕的图片。

如果您想坚持使用软件,将图像的分辨率提高三倍,请不要使用空行和列,或者至少将它们设置为黑色以增加对比度并将RGB分量缩放到全范围。

答案 2 :(得分:1)

为什么不保留背景的放大图像?这将使两个图像在缩小时看起来相同,而RGB条带在放大时将保持清晰可见。

如果没有,请使用整个图像的平均颜色来保持相似的强度,但洗涤效果仍然存在。

中间选项是在图像上应用强大的低通过滤器以平滑所有细节并将其用作背景,但我不会看到比第一种方法更有优势。

enter image description here