Open CV学习
图像读取与显示
灰度图像 - 单通道
彩色图像 - 三通道 (B, G, R)
一般步骤
import cv2 as cv # 导入OpenCV支持(cv2是包的名称不是版本号)
import numpy as np # 所有图像数据都是以 numpy 数组方式存储
imread(filename[,flags]) # imread 函数,读取图像
# filename 表示文件路径, []内可以不填
imshow(winname, mat) # imshow 函数,显示图像
# winname 表示窗口标题, mat 表示图像对象
# 加载通道顺序
显示与等待时间
cv.wajitKey(0)
表示一直等待,直到任意一个键盘操作
cv.waitKey(1000)
表示等待1000ms即1s
如果不加, 图片会一闪而过
实例
import cv2 as cv
import numpy as np
def show_image():
image = cv.imread("E:/data/lena.jpg")
cv.imshow("input", image)
cv.waitKey(0)
cv.destroyAllWindows()
show_image()
图像色彩空间转换
常用色彩空间:
- HSV
- 取值范围H:0 ~ 180,SV:0~255
- RGB
- 计算机显示器的标准支持色彩系统
- 色彩空间设备独立
- 取值范围0~255
- YCrCb
- •Y分量表示信息,CrCb可以被压缩
图像色彩转换
-
从一个色彩空间转换到另外一个色彩空间
-
信息传递与损失
-
过程可逆与不可逆
函数与参数
cv.cvtColor(src,code[,dst[,dstCn]])->dst
# src表示输入图像, 类型CV_8U(np.uint8字节类型)、CV_32F(np.float32浮点数类型)
code表示:
cv::COLOR_BGR2RGB = 4 # 通道交换 cv::COLOR_BGR2GRAY = 6 # 彩色到灰度 cv::COLOR_GRAY2BGR = 8 # 灰度到彩色(信息损失不可逆) cv::COLOR_BGR2HSV = 40 # 可以双线转换
示例:
import cv2 as cv
import numpy as np
def color_space_demo():
image = cv.imread("lena.jpg")
cv.imshow("lena", image)
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)
cv.imshow("hsv", hsv)
cv.imshow("ycrcb", ycrcb)
cv.waitKey(0)
cv.destroyAllWindows()
color_space_demo()
图像对象的创建与赋值
图像对象属性
- 图像宽高 image.shape
- 图像深度 image
- 图像数据类型 image.dtype
- 图像通道 image.shape
- 数据类型
- np.uint8
- np.float32
- np.int32
- np.int64
Numpy 数据包函数
opencv-python中一切图像数据皆numpy array
*• numpy.array(object, dtype=None, , copy=True, order=‘K’, subok=False, ndmin=0, like=None)
-
object 数组
-
dtype 数据类型
*•numpy.zeros(shape, dtype=float, order=‘C’, , like=None)
-
数组维度
-
dtype 数据类型
*•numpy.asarray(a, dtype=None, order=None, , like=None)
-
数组对象
-
dtype 数据类型
•numpy.reshape(a, newshape, order=‘C’)
-
数组维度
-
dtype 数据类型
import numpy as np
np.array([[1, 2],[3, 4]], dtype=np.uint8)
创建图像
•np.zeros ->创建一个黑色背景图像
•np.zeros_like->创建一个与输入图像大小一致的黑色背景图像
•np.ones创建一个全部像素值是1的图像
图像赋值
•图像赋值就是给numpy array数组赋值
•m = np.zeros((3, 3, 3), dtype=uint8)
•m[:] = 255
•创建数组m,然后赋值为255(白色)
•m[:] = (255,0,0)
•创建数组m,然后赋值为(255,0,0)蓝色
代码演示
def numpy_demo():
m1 = np.array([[2,3], [4, 5]], dtype=np.uint8)
print(m1)
m2 = np.ones((4,4,3), dtype=np.uint8)
print(m2)
m2[:] = (255, 0, 0)
print(m2)
m3 = np.zeros((4,4,3),dtype=np.uint8)
print(m3)
m3[:]=255
print(m3)
numpy_demo()
C:\use\anaconda\envs\openvino\python.exe C:/use/E/桌面/cv/opencv/test.py
[[2 3]
[4 5]]
[[[1 1 1]
[1 1 1]
[1 1 1]
[1 1 1]][[1 1 1]
[1 1 1]
[1 1 1]
[1 1 1]][[1 1 1]
[1 1 1]
[1 1 1]
[1 1 1]][[1 1 1]
[1 1 1]
[1 1 1]
[1 1 1]]]
[[[255 0 0]
[255 0 0]
[255 0 0]
[255 0 0]][[255 0 0]
[255 0 0]
[255 0 0]
[255 0 0]][[255 0 0]
[255 0 0]
[255 0 0]
[255 0 0]][[255 0 0]
[255 0 0]
[255 0 0]
[255 0 0]]]
[[[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]][[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]][[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]][[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]]]
[[[255 255 255]
[255 255 255]
[255 255 255]
[255 255 255]][[255 255 255]
[255 255 255]
[255 255 255]
[255 255 255]][[255 255 255]
[255 255 255]
[255 255 255]
[255 255 255]][[255 255 255]
[255 255 255]
[255 255 255]
[255 255 255]]]进程已结束,退出代码0
def numpy_demo():
black = np.zeros((512, 512, 3), dtype=np.uint8)
black[:,0:255] = 255
h,w,c = black.shape
print(h,w,c)
cv.imshow("black", black)
cv.waitKey(0)
cv.destroyAllWindows()
numpy_demo()
图像像素的读写操作
像素访问与遍历
-
像素遍历本质就是numpy数组访问
-
假设变量image
-
获取图像维度信息: image.shape
-
图像访问像素: image[row, col]
-
图像赋值像素: image[row, col] = (b,g,r)
像素读写
-
b, g, r = image[row, col]
-
image[row, col] = (255-b, 255-g, 255-r)
-
读写像素,灰度图像:
-
pv = image[row, col]
-
image[row, col] = 255-pv
示例
def visit_pixel_demo():
image = cv.imread("lena.jpg")
cv.imshow("lina", image)
h, w, c = image.shape
for row in range(h):
for col in range(w):
b, g, r = image[row, col]
# 反色
image[row, col] = (255 - b, 255 - g, 255 - r)
cv.imshow("visited", image)
cv.waitKey(0)
cv.destroyAllWindows()
visit_pixel_demo()
像素算数操作
算数操作
- 加
- 减
- 乘
- 除
支持函数
-
cv.add(src1, src2[, dst[, mask[, dtype]]]) ->dst
-
cv.subtract(src1,src2[,dst[,mask[,dtype]]])->dst
-
cv.multiply(src1,src2[,dst[,scale[,dtype]]])->dst
-
cv.divide(src1, src2[, dst[, scale[, dtype]]])->dst
src1 & src2表示图像
加法,保证不越界:saturate(src1 + src2)-》0~255
超过255取255,小于0取0
- mask参数
- mask区域相加减,其他区域为零
实例
def arithmetic_demo():
image1 = cv.imread("lena.jpg")
h, w, c = image1.shape
image2 = np.zeros_like(image1)
image2[:,:] = (110, 0, 250)
mask = np.zeros((h, w), dtype=np.uint8)
mask[100:200,100:200] = 1;
cv.imshow("img1", image1)
cv.imshow("img2", image2)
added = cv.add(image1, image2, mask = mask)
cv.imshow("added", added)
cv.waitKey(0)
cv.destroyAllWindows()
arithmetic_demo()