最近把Python的基础语法过完了,现在每天大概花一个半小时做一下Python上OpenCV的基本操作。
一、环境配置
1、安装pip工具
pip是Python管理包的一个工具,它可以让你很方便的查找、安装、卸载包。通过pip --version可以查看pip的版本。
使用pip安装包的语法:pip install SomePackage
2、安装opencv-python
pip install opencv-python
二、OpenCV上的Hello World程序:图像加载、显示、保存
#coding:utf-8
import cv2
image = cv2.imread(".\logo.png", cv2.IMREAD_COLOR)
cv2.imshow("image", image)
#等待用户按键
k = cv2.waitKey(0)
if k == 27:
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite(".\logo_copy.png", image)
cv2.destroyAllWindows()
三、操作图像像素
仅仅使用OpenCV也可以访问到图像的像素,但是效率会很低,不建议这样做。一般会使用NumPy库,它是Python语言的一个扩展库,支持大量的维度运算和矩阵运算,是为了进行快速矩阵运算而优化的库。
#coding:utf-8
import numpy as np
import cv2
#参数0---灰度图,1---彩色图,-1---alpha图
image = cv2.imread(".\cat.jpg", 1)
cv2.imshow("img1", image)
#使用 属性shape 打印图像的行数、列数、通道数
#如果是灰度图,则只打印行数、列数
#print(image.shape)
rows = image.shape[0]
cols = image.shape[1]
channel = 1
print(len(image.shape))
if len(image.shape) == 3:
channel = 3
#使用 属性size 打印图像的总位数:行数*列数*通道数
print(image.size)
#属性 属性dtype 打印图像的数据类型
print(image.dtype)
#遍历图像,并提高图像整体的亮度
for i in range(0, rows):
for j in range(0, cols):
#如果是彩色图
if channel == 3:
for c in range(0, 3):
image[i][j][c] = (image[i][j][c] - int(image[i][j][c] / 2))
else:
image[i][j] = (image[i][j] - int(image[i][j] / 2))
cv2.imshow("img2", image)
cv2.waitKey(0)
运行结果:
四、获取图像感兴趣的区域
NumPy支持指定行的范围和列的范围就能够获得感兴趣区域。比如:image[30:100, 30:100]表示的是图像30-100行、30-100列的区域。
#coding:utf-8
import numpy as np
import cv2
#参数0---灰度图,1---彩色图,-1---alpha图
image = cv2.imread(".\cat.jpg", 1)
cv2.imshow("img1", image)
image_roi = image[30:100, 30:100]
image[100:170, 100:170] = image_roi
cv2.imshow("img2", image)
cv2.waitKey(0)
五、图像通道的分隔与合并
在需要的时候,我们可以将一张图像的B、G、R分隔成三个独立的平面。
需要调用的函数分别为cv2.split()、cv2.merge()。
程序:分离并显示图像的各个通道的值
#coding:utf-8
import cv2
import numpy as np
image = cv2.imread(".\cat.jpg", 1)
cv2.imshow("img1", image)
#分离通道
b,g,r = cv2.split(image)
#创建与image大小相同的零矩阵
zeros = np.zeros(image.shape[:2], 'uint8')
#显示三个通道的值
cv2.imshow("img_b", cv2.merge([b, zeros, zeros]))
cv2.imshow("img_g", cv2.merge([zeros, g, zeros]))
cv2.imshow("img_r", cv2.merge([zeros, zeros, r]))
image = cv2.merge([b, g, r])
cv2.imshow("img2", image)
cv2.waitKey(0)
运行结果:
至于为什么要和0合并,可以看一下下面这个链接:
https://blog.csdn.net/u014453898/article/details/80715121