仅包含黑色和白色两种颜色的图像,白色像素点为1,黑色像素点为0
256个灰度级,255表示纯白,0表示纯黑色
在RGB色彩空间中,存在R(red,红色)通道、G (green,绿色)通道和B(blue,蓝色)通道,共三个通道。
每个色彩通道值的范围都在[0,255]之间,用这三个色彩通道的组合表示颜色。
可以调出256×256×256=16 777 216种颜色。
在OpenCV中通道顺序为:B->G->R
像素是图像构成的基本单位,像素处理是图像处理的基本操作,可以通过位置索引的形式对图像内的元素进行访问、处理。
可以使用image[0,0]访问图像image的第0行第0列位置上的像素点
**示例:**将图像img中的在本例中“第10行到99行”与“第80列到99列"交叉区域内的像素值设置为255。从图像img上来看,该交叉区域被设置为白色。
import cv2
img=cv2.imread("lena.png",0)
cv2.imshow("before",img)
for i in range(10,100):
for j in range(80,100):
img[i,j]=255
cv2.imshow("after",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
RGB模式的彩色图像在读入OpenCV内进行处理时,会按照行方向依次读取该RGB图像的B通道、G通道、R通道的像素点,并将像素点以行为单位存储在ndarray的列中。
image[0,0,0]
第一个索引表示第0行
第二个表示第0列
第三个表示第0个颜色通道
import numpy as np
import cv2
#一—---------蓝色通道值-------------
blue=np. zeros((300,300,3) , dtype=np.uint8) #300行300列3通道的数组
blue [ :, :,0]=255
print ("blue=\n", blue)
cv2.imshow ( "blue" , blue)
#一——--------绿色通道值---
green=np.zeros((300, 300, 3) ,dtype=np.uint8)
green[ : , :,1]=255
print ("green=\n" , green)
cv2.imshow ( "green" , green)
#一——--------红色通道值-
red=np.zeros((300,300, 3) ,dtype=np.uint8)
red [ :, :,2]=255
print ("red=\n" , red)
cv2.imshow ( "red" , red)
#一—-------―-释放窗口---
cv2.waitKey ()
cv2.destroyAllwindows ()
**访问像素点:**item(行,列)
**修改像素值:**itemset(索引值,新值)
使用Numpy中的random.randint可以生成一个随机数组,数组对应一幅灰度图像
import numpy as np
import cv2
img=np.random.randint (0,256,size=[256,256],dtype=np.uint8) #随机生成一个256×256的数组,值为0~255,随机
cv2.imshow ("demo",img)
cv2.waitKey ()
cv2.destroyAllWindows ()
**访问像素点:**item(行,列,通道)
**修改像素值:**itemset(三元组索引值,新值)
示例:
1.模拟RGB彩色空间的彩色图像
import numpy as np
img=np.random.randint ( 10,99,size=[2,4,3],dtype=np.uint8)
print("img=\n",img)
print("读取像素点img[1,2,0]=",img.item ( 1,2,0))
print("读取像素点img[0,2,1]=", img.item (0,2,1) )
print("读取像素点img[1,0,2]=", img.item ( 1,0,2) )
img.itemset ( (1,2,0) ,255)
img.itemset ( (0,2,1) ,255)
img.itemset(( 1,0,2) ,255)
print("修改后img=\n",img)
print("修改后像素点img[1,2,0]=",img.item (1,2,0) )
print("修改后像素点img[0,2,1]=",img.item (0,2,1) )
print("修改后像素点img[1,0,2]=",img.item (1,0,2))
2.读取彩色图像,对其像素修改和访问
import cv2
import numpy as np
img=cv2 .imread ( "lenacolor.png")
cv2 .imshow ( "before" , img)
print("访问img.item(0,0,0)=",img.item(0,0,0))
print("访问img.item(0,0,1)=",img.item(0,0,1))
print("访问img.item(0,0,2)=",img.item(0,0,2))
for i in range(0,50):
for j in range (0,100):
for k in range (0, 3) :
img.itemset((i,j,k),255) #白色
cv2.imshow ("after",img)
print("修改后img.item(0,0,0)=" ,img.item (0,0,0))
print("修改后img.item(0,0,1)=" ,img.item (0,0,1))
print("修改后img.item(0,0,2)=" ,img.item (0,0,2))
在图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区域(Region of Interest,ROI)。
示例:获取lena脸部图像
import cv2
import numpy as np
a=cv2.imread ("lenacolor.png",cv2.IMREAD_UNCHANGED)
cv2.imshow ("original",a)
face=np.random.randint (0,256,(180,100,4))
a[220:400,250:350]=face
cv2.imshow ( "result",a)
cv2.waitKey ()
cv2.destroyAllWindows ()
结果:
通过索引的方式,可以直接将各个通道从图像内提取出来。
通过以下方式提取B,G,R通道
b=img[: ,: ,0]
g=img[: ,: ,1]
r=img[: ,: ,2]
函数==cv2.split()==能够拆分图像的通道。
b,g,r=cv2.split (img)
等价为如下
b=cv2.split (a)[0]
g=Cv2.split (a)[1]
r=cv2.split (a)[2]
通道合并是通道拆分的逆过程,通过合并通道可以将三个通道的灰度图像构成一幅彩色图像
函数==cv2.merge()==可以实现图像通道的合并,实现语句为
bgr=cv2.merge([b,g,r])
代码示例:
import cv2
lena=cv2.imread ("lenacolor.png")
b,g,r=cv2.split (lena)
bgr=cv2.merge ([b,g,r])
rgb=cv2.merge ([r,g,b])
cv2.imshow ("lena",lena)
cv2.imshow ("bgr",bgr) #合并成通道顺序为BGR
cv2.imshow ("rgb",rgb) #合并成通道顺序为RGB
cv2.waitKey ()
cv2.destroyAllWindows ()
在图像处理过程中,经常需要获取图像的属性,例如图像的大小、类型等。
(1) shape: 如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或者灰度图像,则仅返回行数和列数。
(2) size: 返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道数为1。
(3)dtype: 返回图像的数据类型。
import cv2
gray=cv2.imread ("lena.bmp",0)
color=cv2.imread ("lenacolor.png")
print ("图像gray属性:")
print ( "gray.shape=",gray.shape)
print ("gray.size=",gray.size)
print ("gray.dtype=",gray.dtype)
print ("图像color属性:")
print ("color.shape=",color.shape)
print ("color.size=",color.size)
print ("color.dtype=",color.dtype)