【问题标题】:How to convert list of pixel into image using python如何使用python将像素列表转换为图像
【发布时间】:2020-06-03 13:26:37
【问题描述】:

我想更改整个图像中的特定像素值。我已使用 img.getdata() 函数将图像转换为列表。现在处理后我想将该列表转换为图像格式。如果您知道任何方法,请建议我这样做。

import cv2
import numpy as np

from PIL import Image
img = Image.open('test.jpg','r')
pix=list(img.getdata())
for i in pix:
    if i ==(254,0,0):
        print("found",i)
        pi=np.array(pix)
        pi=Image.fromarray(pi)
        cv2.imshow("img",pi)

错误是


Traceback (most recent call last):
  File "C:\Python38\pixels.py", line 19, in <module>
    cv2.imshow("img",pi)
TypeError: Expected Ptr<cv::UMat> for argument 'mat'

我也尝试了一些其他方法,但无法看到图像。

【问题讨论】:

  • 你为什么要把PIL和OpenCV混在一起,你自己会糊涂的!为什么将图像视为列表并在for 循环中处理像素?这将非常缓慢且难以调试 - 查看 Stack Overflow 上的其他一些 PIL/OpenCV 问题,并开始考虑使用 Numpy 或 OpenCV 向量化操作。
  • 另外,请记住 JPEG 是 有损,因此如果您正在寻找特定的 RGB(254,0,0) 值,您可能会出错,因为 JPEG 可以并且 WILL 在您写入文件时更改您的值。如果您的值非常具体,则需要使用 PNG 或其他无损格式。
  • 尝试用 pi.show() 替换你的最后一行 - 你不能使用需要 Numpy 数组的 OpenCV 显示 PIL 图像。
  • 你真正想用简单的语言做什么,没有代码?例如。 “我想把所有RGB(254,0,0)的像素都改成红色并显示结果”
  • 使用PIL,您可以使用img1 == img2 比较完整图像,如果它们具有不同顺序的通道,那么它们将是不同的。如果您转换为 numpy 数组,那么您可以比较区域 (img[y1:y2,x1:x2] == img[y3:y4,x3:x4]).all(axis=2).all()

标签: python numpy opencv python-imaging-library numpy-ndarray


【解决方案1】:

这应该会有所帮助:

#!/usr/bin/env python3

import numpy as np
import cv2

# Open an image
im = cv2.imread('image.png')

# Count RGB(254,0 ,0) pixels
sought = [254,0,0]
total  = np.count_nonzero(np.all(im==sought,axis=2))
print(f'Total before: {total}')

# Draw a rectangle 10x10 that colour
im[0:10,0:10] = sought

# Count pixels that colour
total  = np.count_nonzero(np.all(im==sought,axis=2))
print(f'Total after: {total}')

# Save
cv2.imwrite('result.png',im)

样本输出

Total before: 0
Total after: 100

【讨论】:

  • 谢谢它的工作。但你没有得到我的问题。我想比较两个图像。有颜色序列
  • 您需要针对您的问题做一些工作,以便清楚您要做什么。您的代码显示您想知道图像中是否存在具有 RGB(254,0,0) 的像素,因此如果您计算具有 RGB(254,0,0) 的像素数并且它大于零,您肯定会有你的答案吗?如果没有,请澄清您的问题并展示您的图片和您要查找的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多