QQ:3020889729 小蔡
import cv2
img = cv2.imread(r"./imag_in_save/open_class.png") # 读取彩色图片
在读取返回的img中主要是像素信息,包含BGR颜色数据,以及行列参数和当前通道数。
我们可以通过行列区访问某一像素的信息等操作。
除了彩色图片以外,我们有时读取灰度图像时候——除了行列参数外,返回的是相应的强度。
import cv2
img = cv2.imread(r"./imag_in_save/open_class.png", 0) # 读取灰度图片
我们可以从读取返回的img中得到像素的颜色(BGR)信息
color_t = img[200, 120]
直接通过对img的行列搜索得到该点的像素颜色——这里是彩色照片
打印的结果:print(color_t, color_t.dtype)
所以,我补充一下,我们返回的img实际上是具有数据类型属性的——并且图片的像素信息,一般为uint8——这也是,为什么我们创建黑色背景图片时采用numpy的array产生一个指定形状(shape)的数据类型为numpy.uint8的多维数组的原因!!!
我们既然可以得到,同样的也可以通过对行列索引的img实现赋值来修改像素颜色信息等~
import cv2 as cv
import numpy as np
img = cv.imread('./imag_in_save/open_class.png')
color_t = img[200, 120] # 原始数据
print(color_t, color_t.dtype)
# 修改该位置像素信息
img[200, 120] = [255, 0, 255] # 它会在赋值时自动转为uint8
color_t = img[200, 120]
print(color_t, color_t.dtype)
import cv2 as cv
import numpy as np
if __name__ == "__main__":
img = cv.imread('./imag_in_save/open_class.png') # 修改成自己的图片就好
color_t = img[200, 120] # 图片修改后,位置可能需要调整下——因为如果刚好读取到颜色不明显的地方,显示就不形象了
b, g, r = color_t
cv.namedWindow('imag', cv.WINDOW_NORMAL)
cv.resizeWindow('imag', 500, 500)
cv.putText(img, f'{color_t}', (20, 40), cv.FONT_HERSHEY_COMPLEX_SMALL, 2, (int(b), int(g), int(r)), 2, cv.LINE_AA) # 在图像上绘字
img[200, 120] = [255, 0, 255] # 修改像素颜色——它会在赋值时自动转为uint8
color_t = img[200, 120]
b, g, r = color_t
cv.putText(img, f'{color_t}', (20, 140), cv.FONT_HERSHEY_COMPLEX_SMALL, 2, (int(b), int(g), int(r)), 2, cv.LINE_AA)
cv.imshow('imag', img)
cv.waitKey(0)
cv.destroyAllWindows()
array.item()——作为numpy数组的方法,在opencv中imread返回的img也是适用的——因为返回的就是一个numpy数组哦(再次加深影响)——不过呢,item方法返回的是某一个通道的值(所以要获取一个像素的全部颜色信息需要对BGR分别采用该方法3次)
item()参数:
代码展示一下:
import cv2 as cv
import numpy as np
img = cv.imread('./imag_in_save/open_class.png')
print(img.item(200, 120, 0)) # [200, 120]位置的B值
print(img.item(200, 120, 1)) # [200, 120]位置的G值
print(img.item(200, 120, 2)) # [200, 120]位置的R值
打印结果:与之前相同位置的颜色信息比较,发现完全一致——所以这就告诉我们,opencv的使用,必然会与numpy息息相关!
array.itemset()实现对某个像素的某一个通道值进行设置——同样的,完整修改一个像素点全部信息,需要三次不同的通道调用!!!
array.itemset()参数:
代码展示一下:
import cv2 as cv
import numpy as np
img = cv.imread('./imag_in_save/open_class.png')
print("原始[200, 120]位置的B值: "+str(img.item(200, 120, 0))) # 打印原始[200, 120]位置的B值
set_value = 100
print("设置的[200, 120]位置的B值: "+str(set_value))
img.itemset((200, 120, 0), 100) # 设置[200, 120]位置的B值为100
print("现在[200, 120]位置的B值: "+str(img.item(200, 120, 0))) # 打印现在[200, 120]位置的B值
直接上代码:
import cv2 as cv
import numpy as np
if __name__ == "__main__":
img = cv.imread('./imag_in_save/open_class.png')
print(img.shape)
打印结果:(返回的是该array数组的形状——表示行列和通道数——这是对于彩色图片的)
针对这个特性——可以推出,灰度图片判别的方式之一是,shape是否含有通道数——无的话,就是灰度图像了。
我们imread方法返回的数据是一个numpy的array数组,是多维度的——介于这个特性,我们可以对图像进行很多科学计算——以上的像素处理仅仅是基础应用,或者说熟悉如何去处理像素信息,像素是什么的认识。在后边,慢慢接触,可能会有更多的类似图像复制,拼接图像,检测特征等。
总之,numpy的方法,对opencv都是适用的——
比如采用numpy.zeros()方法创建指定大小的黑色图片:img = np.zeros((512, 512, 3), np.uint8)
从这里,也可以看出,图像的基本数据类型是uint8,和彩色图片的数组形状——也就是行列,以及彩色图片必含的3个通道数(BGR)