图像的基础操作
获取并修改像素值
import cv2
img1 = cv2.imread("voice.PNG")
cv2.imshow("M1X1M1YA",img1)
#查看宽100 高100像素值的数值
print(img1[100,100])
print("BGR",img1[100,100])
#查看宽100 高100像素值的 第0通道的数值(B)
print("B通道:",img1[100,100,0])
#更改像素值的数值
img1[100,100] = [0,0,0]
#更改某个通道的像素值数值
img1[100,100,0] = 255
#查看更改后的数值
print("更改后",img1[100,100])
cv2.waitKey(0)
效果如下:
Numpy 是经过优化了的进行快速矩阵运算的软件包。所以我们不推荐逐个获取像素值并修改,这样会很慢,能有矩阵运算就不要用循环。因为使用Numpy的array.item()和array.itemset()方法可以更高效地访问和修改像素值,因为它们直接操作数组元素而不是访问像素对象的属性。同时,它们也可以用于处理多通道图像,例如在BGR颜色空间中,可以通过索引来访问和修改B、G、R通道的像素值。
但是,array.item()和array.itemset()方法的返回值是标量,不能直接返回多通道图像的所有像素值。因此,在处理多通道图像时,需要使用这些方法来分离每个通道的像素值,即在BGR颜色空间中,需要分别使用array.item(i,j,0)、array.item(i,j,1)、array.item(i,j,2)来获取像素的B、G、R通道的值。
下面代码展示之间的差别:
import cv2
import time
img1 = cv2.imread("voice.PNG")
w = img1.shape[0]
h = img1.shape[1]
start_time = time.time()
for i in range(w):
for ii in range(h):
img1[i,ii,0] = 0
end_time = time.time()
print("img[]:", end_time - start_time)
start_time = time.time()
for i in range(w):
for ii in range(h):
img1.itemset((i, ii, 0), 255)
end_time = time.time()
print("img.itemset:",end_time - start_time)
cv2.imshow("M1X1M1YA",img1)
cv2.waitKey(0)
获取图片属性
import cv2
import numpy as np
import time
#尝试使用uint16的格式读取
img1 = cv2.imread("voice.PNG")
print("BGR的属性:",img1.shape,"大小:",img1.size,"位深度",img1.dtype,"100,100的",img1[100,100])
img2 = cv2.imread("voice.PNG",