opencv-python笔记2-图像表示方法和像素处理
1. 二值图像
只包含黑色和白色的图像,不难理解。
计算机储存图像是离散的,对于二值图像,使用一个比特位就能表示每个像素点的颜色,即使用1、0就能表示图像。
2. 灰度图像
计算机将灰度处理为256个灰度级,[0,255]这个区间。
255表示纯白,0表示纯黑。
256个灰度级恰好可以用8位二进制一个字节表示。
3. 彩色图像
彩色空间具有不同的表示方式,常用的是RGB色彩空间。
RGB是三个颜色通道,每个颜色的通道的范围都为[0,255]。
256的三次方为16777216,也就是说总共可以产生这么多种颜色。
通常用一个三维数组来表示一幅RGB图像。
一般情况,通道顺序为R-G-B,但是在OpenCV中是B-G-R。
4. 像素处理
1)
在OpenCV中,最小的数据类型是无符号的8位数。
可以使用Numpy生成一个三维数组,一个维度一个通道,表示出一张图片
import numpy as np
import cv2
img = np.zeros((300,300,3),dtype = np.uint8)
img[:,0:120,0] = 220
img[:,100:200,1] = 250
img[:,180:300,2] = 230
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2)
并且可以这样直接访问RGB图片上任意一点的像素值
cus = cv2.imread('C:\\8.png',-1)#-1:保持原格式不变
print(f'查看图上[0,10]的像素值:{cus[0,10]}')
3)
numpy.array提供了item()和itemset()函数来访问和修改像素值。
这两个函数都是经过优化过的,可以大幅度地提高处理效率,比直接索引要快得多。
cus = cv2.imread('C:\\8.png',0)#修改格式为黑白图片
print(f'读取[10,10]点像素值:{cus.item(10,10)}')
cus1 = cv2.imread('C:\\8.png',-1)#原格式
print(f'读取[10,10,0]点的像素值:{cus1.item(10,10,0)}')
cv2.imshow('pic1',cus1)
cv2.waitKey(0)
cv2.destroyWindow('pic1')
for i in range(10,100):
for j in range(20,200):
for k in range(0,3):
cus1.itemset((i,j,k),200)
cv2.imshow('pic2',cus1)
cv2.waitKey(0)
cv2.destroyAllWindows()
不过这样有一个比较遗憾的地方,访问RGB图像不能像直接访问那样,可以只给一个二维坐标,然后给你一个RGB三个参数的结果。使用item(),itemset()函数必须要把通道信息带上,0,1,2必须表明。