【问题标题】:Changing pixel colors in png not working correctly (python, pillow)更改 png 中的像素颜色无法正常工作(python、枕头)
【发布时间】:2018-11-19 06:56:12
【问题描述】:

我正在尝试编写一个 python 脚本来更改 png 文件中文本的颜色。这是一个原始图像的示例

例如,假设我想将洋红色更改为蓝色。我的脚本将任何非黑色 (255,255,255) 的颜色更改为蓝色。我的假设是这会将洋红色文本更改为蓝色,因为图像中的其他所有内容都是不同的单一纯色(python 将其读取为黑色)。相反,这是我得到的结果

显然,这是不正确的。我有点难过。谁能告诉我发生了什么以及如何解决这个问题?这是我第一次尝试使用 python 进行图像处理。

这是我的代码

from __future__ import division
from pylab import*
from math import*
from random import*
from scipy.optimize import curve_fit
import numpy as np

from PIL import Image 

# https://www.codementor.io/isaib.cicourel/image-manipulation-in-python-du1089j1u
#change color 
#https://stackoverflow.com/questions/36468530/changing-pixel-color-value-in-pil



image_name = 'Q_test.png'
test_image = 'Q_blue.png'
R1_Path = "C:/Users/PancakeMSTR/Desktop/Keyboard Related/Fusion Keycaps/Cherry/UpdatedLegends/Katakana_Updated/R1/"

image = Image.open(R1_Path+image_name)
image = image.convert('RGB') 
colors = image.getcolors()
pixelMap = image.load() 

newImg = Image.new(image.mode,image.size) 
pixelsNew = newImg.load() 
width,height = newImg.size
for i in range(width): 
    for j in range(height): 
        if pixelMap[i,j] != (255,255,255): 
            pixelsNew[i,j] = (0,0,255)
        else: 
            pixelsNew[i,j] = pixelMap[i,j]
image.close() 
newImg.save(R1_Path+test_image)

谢谢!让我知道是否需要任何进一步的信息。很高兴澄清我所说的一切。

【问题讨论】:

  • 黑色是 (0,0,0)。白色是 (255,255,255)
  • 知道您的图像有 18 种独特的颜色可能会让您感到惊讶。
  • 只是检查 - 你看到我的答案了吗?它有帮助吗?如果没有,缺少什么?

标签: python image-processing python-imaging-library


【解决方案1】:

将其保存为 BMP 文件解决了该问题。

【讨论】:

    【解决方案2】:

    图像包含 alpha 透明度,您看到的大块实际上在原始图像中显示为 - 但 alpha 蒙版隐藏了它们。您在这篇文章中看到的白色背景实际上并不是白色,而是完全透明的。其他图像查看器可能会显示均匀的灰色或灰色方格背景。

    问题几乎立即出现在您的代码中,因为您将图像展平为 RGB:

    image = Image.open(R1_Path+image_name)
    image = image.convert('RGB') 
    

    现在image.show() 会告诉你,正是在这个时候,透明度被移除,大块出现了。ª

    不过,似乎没有理由转换为 RGB,因为这张图片已经是一张了;那么为什么不保持原样呢。唯一的问题是,当您测试一个非白色像素时,您必须首先测试其基础颜色(白色其他颜色)是否实际上已经不可见,因为透明度。然后,仅当像素可见时,测试其颜色。

    我没有对“白色”进行精确测试(无论如何您都需要重新考虑,因为这张图片中没有纯白色),我在这里只测试一个通道。对于其他图像,这可能不起作用,您需要一些启发式公式——例如将颜色转换为灰度。由于这适用于您的图像,因此我没有进一步调查。

    from PIL import Image 
    image = Image.open('eq2hl.png')
    pixelMap = image.load()
    newImg = Image.new(image.mode,image.size)
    pixelsNew = newImg.load() 
    width,height = newImg.size
    for i in range(width): 
        for j in range(height):
            pixelsNew[i,j] = pixelMap[i,j]
            if pixelMap[i,j][3] < 250:
                pixelsNew[i,j] = (255,255,255,255)
            elif pixelMap[i,j][0] < 255:
                pixelsNew[i,j] = (0,0,255,255)
    newImg.show()
    

    ... 结果:

    其中所有几乎完全透明的像素都替换为实际白色,每个非白色像素都替换为纯蓝色。顺便说一句,最后一步也杀死了边缘的抗锯齿,但这是游戏的一部分。保留它是可能的,但它会多一点代码。


    ª 您可以将此称为 PIL 转换错误。转换所做的只是丢弃整个 Alpha 通道。另一方面,正确删除 alpha 需要您提供背景颜色。如果您需要,请参阅 How can I set the background of a transparent image to white, using PIL? 了解如何执行此操作的示例。

    【讨论】:

      猜你喜欢
      • 2012-03-18
      • 2021-02-16
      • 2014-04-12
      • 2018-12-20
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多