gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:14:05 25 4
gpt4 key购买 nike

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

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

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

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

Like Medium Zoom

这是一张放大的图片,您可以清楚地看到单个像素和 RGB 方块:

Like Zoome In

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

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

所以我的问题是:

1:是否有任何可用的工具可以做到这一点(或类似的东西)?

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

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

最佳答案

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

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

当您缩小图像查看器时,您也可能会看到 Gamma 问题。许多观众在调整大小时不会费心进行 Gamma 校正。更深入的解释见 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

关于image-processing - 将图片转换为 RGB 点图像(半色调效果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47587136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com