第三章-OpenCV基础-2&3-图像处理

像素处理

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

一张图片有宽高的直观属性,宽高构成了以右上为原点,宽为x轴&列为y轴的坐标系,每个坐标点就是像素点索引位置所在,而整张图也就是一个二维数组。

二值图&灰度图每个索引点的数据是此坐标点的黑白颜色值,具体类型为,二值图的每个点的颜色值为0&255,灰度图的每个点的颜色值为[0,255]。所以,二值图也是特殊的灰度图。灰度图在计算机的表现是一个保存整型数据的二维数组。

彩色图片每个索引点的数据是类似列表形式(表现为[aa bb cc])实际类型为的颜色值组合,颜色值分别是B、G、R通道此索引位置取出的颜色值。当B、G、R通道各个索引位置的各个颜色值都相同时,此时彩色图片表现为灰度图(看起来是,但实际不是)。彩色图在计算机的表现是一个保存[aa bb cc]形式数据的二维数组(实际也可以看成三维数组,理解起来就是长宽高的立方体,长宽为图片的长宽,高恒为通道数,一般为3)。

灰度图

import cv2 as cv
import numpy as np

# 生成一个10*10的二维数组,初始值为0
pic = np.zeros((10, 10), np.uint8)
print(pic)
# 显示纯黑
cv.imshow("np zero", pic)
# 生成一个10*10的二维数组,初始值为1
pic = np.ones((10, 10), np.uint8)
# 显示近似纯黑(反正眼睛看不出来)
cv.imshow("np one", pic)
print(pic)
# 二维数组的每个元素从1设置为255
pic = pic[:, :] * 255
print(pic)
# 改变某个点的颜色值,(5,5)第6行第6列
pic[5, 5] = 0
print(pic)
# 显示纯白,点(5,5)为白色
cv.imshow("np 255", pic)
cv.waitKey()
cv.destroyAllWindows()

注意:

  1. numpy.zeros((w,h),numpy.uint8) 和numpy.ones((w,h),numpy.uint8)为生成w列h行的初始值分别为0和1的二维数组,类型为
  2. pic[ : , : ]类似于切片操作,为全选二维数组,如果部分选择,等同于切片用法
  3. 图片数据来源也可以通过imread读取灰度图来获得

彩色图像

import cv2 as cv

lena = cv.imread("lenacolor.png")
print(lena)  # 打印处所有位置及通道的颜色值
print("---------------------")
print(lena[0])  # 打印出一行的所有通道的颜色
print("---------------------")
print(lena[0, 0])  # 打印处单个点的三个通道的颜色值
print("---------------------")
print(lena[0, 0, 0])  # 原点位置B通道的颜色值
print(lena[0, 0][0])  # 等同于上面
print("---------------------")
print(lena[0, 0, 1])  # 原点位置G通道的颜色值
print(lena[0, 0][1])  # 等同于上面
print("---------------------")
print(lena[0, 0, 2])  # 原点位置R通道的颜色值
print(lena[0, 0][2])  # 等同于上面

lena[10:100, 20:120, 0:2] = 255  # 切片操作修改区域及通道的值

cv.imshow("half", lena[0:256, :])
cv.waitKey()
cv.destroyAllWindows()

程序运行如下:

注意:

  1. OpenCV在处理RGB模式的彩色图像时,回按照方向依次读取该图像的B通道,G通道,R通道的像素值,并将像素值依次存放在ndarray类中
  2. 可以通过lena[x,y,z]或者lena[x,y][z]的形式读取到通道中的颜色值
  3. 可以切片式修改ndarray类中数据,注意长宽及通道索引值不要越界

通道拆分

RGB图像由R通道,G通道,B通道组成,经过OpenCV读取后,顺序依次变成B通道,G通道,R通道。除开之前提供的切片方法得到单通道数据后,OpenCV也提供了单独的方法split()获取单通道。

import cv2 as cv

lena = cv.imread("face1.jpg")
# 切片方式分别得到单通道数据
b1 = lena[:, :, 0]
g1 = lena[:, :, 0]
r1 = lena[:, :, 0]
print(b1)
print(g1)
print(r1)

# 通过cv2.split()一次性得到所有的单通道数据
b2, g2, r2 = cv.split(lena)
#上面语句等价于下面语句
b2=cv.split(lena)[0]
g2=cv.split(lena)[1]
r2=cv.split(lena)[2]
print(b2)
print(g2)
print(r2)

通道合并

import cv2 as cv

lena = cv.imread("face1.jpg")
# 通过cv2.split()一次性得到所有的单通道数据
b1, g1, r1 = cv.split(lena)

cv.imshow("lena", lena)

new_lena = cv.merge([b1, g1, r1])  # 使用cv2.merge()合并通道形成彩照数据,注意通道顺序不能乱,
cv.imshow("new_lena", new_lena)
cv.waitKey()
cv.destroyAllWindows()

调整图像大小

OpenCV提供了调整图片大小的方法cv2.resize(),具体可以根据比例来缩放,也可以根据具体显示大小来设置

import cv2 as cv

# dst=cv2.resize(src,dsize)             dsize=(size_y,size_x)
# dst=cv2.resize(src,dsize,fx,fy)       fx,fy缩放大小
lena = cv.imread("face1.jpg")
cv.imshow("lena", lena)
# 指定大小缩放
size = (300, 300)
size_200 = cv.resize(lena, size)
cv.imshow("resize", size_200)
# 按比例缩放
rows, cols = lena.shape[:2]
resize1 = cv.resize(lena, (round(cols * 0.5), round(rows * 0.5)))
cv.imshow("resize1 0.5 0.5", resize1)

# 按比例缩放2 设置行,后设置列,行为0.5倍,列为0.3倍:
resize2 = cv.resize(lena, None, fx=0.5, fy=0.3)
cv.imshow("resize2 0.5 0.3", resize2)

cv.waitKey()
cv.destroyAllWindows()

感兴趣区域ROI

图像处理过程中对图像感兴趣的区域,成为感兴趣区域(Region of Interest , ROI )

操作就是对图像部分区域进行处理而已,知道有ROI这个概念即可

猜你喜欢

转载自blog.csdn.net/sunguanyong/article/details/129188852