Image processing 将图片转换为RGB点图像(半色调效果)

Image processing 将图片转换为RGB点图像(半色调效果),image-processing,colors,image-effects,Image Processing,Colors,Image Effects,我试图向学生展示RGB颜色模型如何创建特定的颜色(或者让他们相信它确实如此)。因此,我想拍摄一张照片,并将每个像素转换为RGB表示,这样当您放大时,而不是单一颜色的像素,您可以看到RGB颜色 我已经这样做了,但由于一些非常明显的原因,转换后的图片要么被洗掉了,要么比原稿更暗(这是一个小小的不便,但我认为如果我能让它更像原稿,它会更强大) 以下是两张“缩小”的图片: 这是一个“中等变焦”,开始显示转换图片中的RGB瑕疵: 这是一张放大到可以清晰看到单个像素和RGB正方形的图片: 你会注意到像

我试图向学生展示RGB颜色模型如何创建特定的颜色(或者让他们相信它确实如此)。因此,我想拍摄一张照片,并将每个像素转换为RGB表示,这样当您放大时,而不是单一颜色的像素,您可以看到RGB颜色

我已经这样做了,但由于一些非常明显的原因,转换后的图片要么被洗掉了,要么比原稿更暗(这是一个小小的不便,但我认为如果我能让它更像原稿,它会更强大)

以下是两张“缩小”的图片:

这是一个“中等变焦”,开始显示转换图片中的RGB瑕疵:

这是一张放大到可以清晰看到单个像素和RGB正方形的图片:

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

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

所以我的问题是:

1:是否有任何可用的工具已经完成了这项工作(或类似的工作)

2:关于如何使转换后的图像更接近原始图像,有什么想法吗


对于第二个问题,我当然可以只增加每个“RGB像素”(每个正方形中的三条水平条纹)的亮度,但增加多少?我当然不能把RGB整数乘以3(这显然是对我上面所说的补偿)。我想知道是否有办法调整我的背景色来补偿我?还是说每一张照片都需要处理一些东西?

不要在这上面浪费太多时间。如果其中一个图像中的信息较少,则无法使两个图像看起来相同。你仍然有你的电脑,可以在缩小的同时以奇怪的方式对你的图像进行二次采样

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


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

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

如果没有,则使用整个图像的平均颜色来保持相似的强度,但洗涤效果将保持不变

一个中间选择是在图像上应用一个强低通滤波器来平滑所有细节,并将其用作背景,但我看不出与第一种方法相比有什么真正的优势


您正确地假设可以通过将所有内容乘以3来保持亮度。只有一个小问题:图像中的RGB值使用伽马校正,因此强度不是线性的。您需要对这些值进行反gamma运算、相乘,然后再次进行gamma校正

您还需要丢失每个像素周围的边框。这些边界占据了最终图像的7/16,这太多了,无法补偿。我试着每隔一个像素旋转90度,虽然它给出了一个明确的之字形图案,但它确实清楚像素边界在哪里

在图像查看器中缩小时,可能也会看到gamma问题。许多浏览者在调整大小时不必费心进行gamma校正。有关详细说明,请参阅,并使用最后提供的测试图像。最好完全放弃缩放,从监视器中退一步

下面是一些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])

它会让你看起来很苍白/黑暗,因为你只会显示原来亮度的1/3。乘以3是一个很好的策略,直到你将强度饱和到255。你是否考虑过在LCD屏幕或平板电脑上使用放大镜?这是一个好主意。(我的意思是用这种方式来解释RGB。)为了说明它的价值,我在一个关于RGB值的简短讲座之后,尝试了与学生们一起进行这项研究。当他们放大时,看到的是那些看起来像国旗的小方格。我认为这是一个很好的钩子。一些学生问为什么缩小后的图像看起来像这样。请注意,这不是一门编程课程,所以我试图解释他们看到了什么(以及它是如何与他们的原始图像相关的),但显然没有详细说明这是如何实现的。@RingØit is Ray Wise,这是STNG插曲中的正确答案。放大镜。对孩子们来说,这样做也比看你事先准备好的任何图像有趣得多。现在很多手机的分辨率都很高,你可能需要显微镜而不是放大镜。桌面显示器应该可以很好地工作。@CrisLuengo这是真的(关于预先准备好的图像),但是我实际上让他们下载了一张他们选择的图片,然后通过这个“过滤器”查看他们自己的带有RGB方块的图像。当缩小时,也竖起大拇指指出子采样。我认为它在缩放级别上更强大一点,你可以清楚地看到RGB方块(非常小,但肯定有),但你可以看到一些细节。事实上,“像素化”图片中的信息并不比原始图片中的信息少(特别是因为我使用PNG压缩——有