如何使用python将像素列表转换为图像
我想更改整个图像中的特定像素值。我已使用img.getdata()函数将图像转换为列表。现在,在处理后,我想将该列表转换为图像格式。如果您知道任何方法,请建议我如何使用python将像素列表转换为图像,python,numpy,opencv,python-imaging-library,numpy-ndarray,Python,Numpy,Opencv,Python Imaging Library,Numpy Ndarray,我想更改整个图像中的特定像素值。我已使用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
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'
回溯(最近一次呼叫最后一次):
文件“C:\Python38\pixels.py”,第19行,在
cv2.imshow(“img”,pi)
TypeError:参数“mat”应为Ptr
我也尝试过其他方法,但无法看到图像。这应该有帮助:
#!/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
这将有助于:
#!/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
你为什么把PIL和OpenCV混在一起,你会把自己搞糊涂的!为什么要将图像视为列表,并在
for
循环中处理像素?这将是非常缓慢和难以调试的-看看其他一些关于堆栈溢出的PIL/OpenCV问题,并开始考虑使用Numpy或OpenCV矢量化操作。另外,请记住JPEG是有损的,所以如果您查找特定的RGB(254,0,0)值,可能会出错,因为JPEG可以并且将在您写入文件时更改您的值。如果您的值是特定的,您需要使用PNG或其他无损格式。请尝试将最后一行替换为pi.show()
-您不能使用OpenCV显示需要Numpy数组的PIL图像。如果没有代码,您实际想用普通语言做什么?例如,“我想将RGB(254,0,0)的所有像素更改为红色并显示结果”与PIL
您可以使用img1==img2
比较完整图像,如果它们具有不同顺序的通道,则它们将不同。如果您转换为numpy数组,那么您可以比较区域(img[y1:y2,x1:x2]==img[y3:y4,x3:x4])。all(axis=2)。all()
为什么要混合PIL和OpenCV,您会感到困惑!为什么要将图像视为列表,并在for
循环中处理像素?这将是非常缓慢和难以调试的-看看其他一些关于堆栈溢出的PIL/OpenCV问题,并开始考虑使用Numpy或OpenCV矢量化操作。另外,请记住JPEG是有损的,所以如果您查找特定的RGB(254,0,0)值,可能会出错,因为JPEG可以并且将在您写入文件时更改您的值。如果您的值是特定的,您需要使用PNG或其他无损格式。请尝试将最后一行替换为pi.show()
-您不能使用OpenCV显示需要Numpy数组的PIL图像。如果没有代码,您实际想用普通语言做什么?例如,“我想将RGB(254,0,0)的所有像素更改为红色并显示结果”与PIL
您可以使用img1==img2
比较完整图像,如果它们具有不同顺序的通道,则它们将不同。如果您转换为numpy数组,那么您可以比较区域(img[y1:y2,x1:x2]==img[y3:y4,x3:x4])。全部(axis=2)。全部()
谢谢。但您没有回答我的问题。我想比较两幅具有颜色序列的图像。您需要对您的问题做一些工作,以便清楚您想做什么。您的代码显示您想知道图像中是否有RGB(254,0,0)的像素,因此,如果您计算RGB(254,0,0)的像素数且大于零,您肯定会得到答案?如果没有,请澄清您的问题,并展示您的图片和您正在寻找的内容。谢谢,这是有效的。但您没有收到我的问题。我想比较两张图片。这两张图片具有颜色顺序。您需要对您的问题做一些工作,以便清楚您正在尝试做什么。您的代码显示您想知道图像中是否有RGB(254,0,0)的像素,因此,如果您计算RGB(254,0,0)的像素数且大于零,您肯定会得到答案?如果没有,请澄清您的问题,并展示您的图片和您正在寻找的内容。