Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python将像素列表转换为图像_Python_Numpy_Opencv_Python Imaging Library_Numpy Ndarray - Fatal编程技术网

如何使用python将像素列表转换为图像

如何使用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

我想更改整个图像中的特定像素值。我已使用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'


回溯(最近一次呼叫最后一次):
文件“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)的像素数且大于零,您肯定会得到答案?如果没有,请澄清您的问题,并展示您的图片和您正在寻找的内容。