OpenCV-python学习笔记(二)——图像处理基础

二 、图像处理基础

1、图像的基本表示方法

2.1.1 二值图像

仅包含黑色和白色两种颜色的图像,白色像素点为1,黑色像素点为0

2.1.2 灰度图像

256个灰度级,255表示纯白,0表示纯黑色

2.1.3 彩色图像

在RGB色彩空间中,存在R(red,红色)通道、G (green,绿色)通道和B(blue,蓝色)通道,共三个通道。

每个色彩通道值的范围都在[0,255]之间,用这三个色彩通道的组合表示颜色。

可以调出256×256×256=16 777 216种颜色。

在OpenCV中通道顺序为:B->G->R

2、像素处理

像素是图像构成的基本单位,像素处理是图像处理的基本操作,可以通过位置索引的形式对图像内的元素进行访问、处理。

2.2.1 二值图像及灰度图像

可以使用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()

结果

2.2.2 彩色图像

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 ()

结果
OpenCV-python学习笔记(二)——图像处理基础_第1张图片

3、使用numoy,array访问像素

2.3.1 二值图像及灰度图像

**访问像素点:**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 ()

结果:
OpenCV-python学习笔记(二)——图像处理基础_第2张图片

2.3.2 彩色图像

**访问像素点:**item(行,列,通道)

**修改像素值:**itemset(三元组索引值,新值)

OpenCV-python学习笔记(二)——图像处理基础_第3张图片

示例:

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))

四、感兴趣区域(ROI)

在图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区域(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 ()

结果:

五、通道操作

2.5.1 通道拆分

2.5.1.1 索引拆分

通过索引的方式,可以直接将各个通道从图像内提取出来。

通过以下方式提取B,G,R通道

b=img[: ,: ,0]
g=img[: ,: ,1]
r=img[: ,: ,2]
2.5.1.2 函数拆分

函数==cv2.split()==能够拆分图像的通道。

b,g,r=cv2.split (img)
等价为如下
b=cv2.split (a)[0]
g=Cv2.split (a)[1]
r=cv2.split (a)[2]

2.5.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)

结果:
OpenCV-python学习笔记(二)——图像处理基础_第4张图片

你可能感兴趣的:(OpenCV,计算机视觉,opencv,图像处理)