【发布时间】: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