11.二值图像、灰度图像、彩色图像
二值图像:仅包含白色和黑色两种颜色的图像,白色记为1,黑色记为0,如下图所示
灰度图像:用 [0,255] 表示256个灰度等级,0表示纯黑色,255表示纯白色。
彩色图像:由红绿蓝三通道组成;彩色空间中,存在R(红色)通道、G(绿色)通道、B(蓝色)通道、这三个通道,每个色彩通道值的范围都在[0,255]之间。
注意:彩色空间中通道顺序是RGB,opencv中是B——G——R。
2.像素处理
import cv2
img = cv2.imread(r"D:\Program Files\JetBrains\opencv\xiaotaoxuejie.jpg",0)
cv2.imshow("before",img)
###嵌套语句,从10行到99行,从80列到99列,这个两个区域交叉部分的像素值设为255,即BGR三通道的像素值都为255
###range(a,b) 从a到b-1,含a但不包括b
for i in range(10,100):
for j in range(80,100):
img[i,j] = 255
cv2.imshow("after",img)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果为:
用numpy生成一个三维数组,观察像素值、显示图像
import numpy as np
import cv2
#--------------蓝色通道------------
blue = np.zeros((300,500,3),dtype = np.uint8) #3指的是rgb这3个通道,一个由300行300列位置构成的图像
blue[:,:,0] = 255 #将所有行和列的0通道(b通道)的像素值都设为255
print("blue = \n",blue)
cv2.imshow("blue",blue)
#--------------绿色通道------------
green = np.zeros((300,300,3),dtype = np.uint8)
green[:,:,1] =255 #将所有行和列的1通道(g通道)的像素值都设为255
print("green = \n",green)
cv2.imshow("green",green)
#-------------红色通道-------------
red = np.zeros((600,300,3),dtype = np.uint8)
red[:,:,2] = 255 #将所有行和列的1通道(b通道)的像素值都设为255
print("red = \n",red)
cv2.imshow("red",red)
#-------------释放窗口-------------
cv2.waitKey()
cv2.destroyAllWindows()
运行结果如下:
修改不同位置的不同通道的像素值
import numpy as np
import cv2
img = np.zeros((300,300,3),dtype = np.uint8)
img[:,0:100:,0] = 255
img[:,100:200,1] = 255
img[:,200:300,2] = 255
print('img = \n',img)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果如下:
模拟BGR彩色图像,修改某个位置的像素值,观察变化
import numpy as np
import cv2
img = np.zeros((300,600,3), dtype = np.uint8)
print('img = \n',img)
print('读取像素点 img[0,3]=',img[0,3]) #访问0行3列位置上的B、G、R通道的3个像素值
print('读取像素点 img[1,2,2]=',img[1,2,2]) #访问1行2列位置上的R通道的像素值
print('读取像素点 img[0,0,0]=',img[0,0,0])
print('读取像素点 img[1,1,1]=',img[1,1,1])
print('读取像素点 img[1,2,0]=',img[1,2,0])
print('读取像素点 img[0,2,0]=',img[0,2,0])
cv2.imshow('imgbefore',img)
img [0:100,30:50] = 255 #0-100行,30-50列 的像素值变为255(白),【bgr三个通道的像素值都改为255】
img [0,0] = [66,77,88] #0行0列的位置上的b通道、g通道、r通道的像素点的像素值分别改为66、77、88
img [1,1,1] = 3 #1行1列的1通道(B通道)的像素值修改为3
img [1,2,2] = 4
img [0,2,0] = 5
print('修改后 img\n',img)
print('读取修改后像素点 img[0,0,0]=',img[0,0,0])
print('读取修改后像素点 img[1,1,1]=',img[1,1,1])
print('读取修改后像素点 img[1,2,0]=',img[1,2,0])
print('读取修改后像素点 img[0,2,0]=',img[0,2,0])
cv2.imshow('imglast',img)
cv2.waitKey()
运行结果如下:
修改前、后的读取:
3.彩色图像的像素值的访问修改
import cv2
img = cv2.imread('D:\Program Files\JetBrains\opencv/xiaotaoxuejie.jpg')
cv2.imshow("before",img)
#cv2.waitKey()
print('访问img[0,0]',img[0,0]) #访问0行0列的三个通道的像素值
print('访问img[0,0,0]',img[0,0,0]) #访问0行0列的b通道的像素值
print('访问img[0,0,1]',img[0,0,1])
print('访问img[0,0,2]',img[0,0,2])
print('访问img[50,0]',img[50,0])
print('访问img[100,0]',img[100,0])
#------区域1
for i in range(0,50):
for j in range(0,100):
for k in range(0,3):
img[i,j,k] = 255 #白色
# 0-50行, 0-100列的 三个通道的像素值都改为255
#------区域2
for i in range(50,100):
for j in range(0,100):
img[i,j] = [128,128,128] #灰色
#50-100行 0-100列的三个通道的像素值都改为128
#------区域3
for i in range(100,150):
for j in range(0,100):
img[i,j] = 0 #黑色
#100-150行 0-100列的三个通道的像素值都改为0
cv2.imshow("after",img)
print('访问img[0,0]',img[0,0])
print('访问img[0,0,0]',img[0,0,0])
print('访问img[0,0,1]',img[0,0,1])
print('访问img[0,0,2]',img[0,0,2])
print('访问img[50,0]',img[50,0])
print('访问img[100,0]',img[100,0])
cv2.waitKey()
cv2.destroyAllWindows()
运行结果如下:
如下图中箭头处所示的代码,倘若:
-
不注释掉:则会在before图像显示后需按下键盘才能显示第二张after的图
-
注释掉:两张图一起显示
原因:waiytKey()