python-opencv的一些基本使用
前言
像我工作中会经常用到opencv的一些功能,这里做下使用笔记及一些重要函数的笔记
一、基本使用
import cv2
path = 'test.jpg'
# cv2.IMREAD_GRAYSCALE 灰度图形式打开,cv2.IMREAD_COLOR 默认打开
image = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
# 显示图片
cv2.imshow('test_win', image)
# 等待输入打断
cv2.waitKey(0)
其中值得一提的是,通过imread返回的值是一个numpy形式的数组,但是BGR模式,而 matplotlib.pyplot 接口使用的是RGB模式,如在TensorFlow和其他深度学习框架打开也是RGB模型,所以使用opencv处理输入必须转为同样的形式。
import cv2
import matplotlib.pyplot as plt
path = 'test.jpg'
img = plt.imread(path )
# opencv显示
cv2.imshow('test_win', img)
cv2.waitKey(0)
# plt显示
plt.imshow(img)
plt.show()
# 等待输入打断
cv2.waitKey(0)
上面打开的RGB形式的图片,用opencv和plt显示会有不一样的颜色(opencv BGR),可以使用下面的代码转变通道值
import cv2
import matplotlib.pyplot as plt
path = 'test.jpg'
img = plt.imread(path)
# 转为opencv形式
img_rev = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# opencv显示
cv2.imshow('test_win', img_rev)
cv2.waitKey(0)
# plt显示
plt.imshow(img)
plt.show()
# 等待输入打断
cv2.waitKey(0)
二、图像学一些重要概念
以下介绍我工作中经常用到的一些函数,二值化,腐蚀,膨胀,模糊等
1、二值化
二值化处理顾名思义就是讲图片那种(width, height, channel)在0-255间的数值按照一定的关系转为0 1这种只有黑白颜色的图,以下是基本的使用和示例
# 反相灰度图,将黑白阈值颠倒
def accessPiexl(img):
height = img.shape[0]
width = img.shape[1]
for i in range(height):
for j in range(width):
img[i][j] = 255 - img[i][j]
return img
# 反相二值化图像
def accessBinary(img, threshold=128):
img = accessPiexl(img)
# 边缘膨胀,不加也可以
kernel = np.ones((3, 3), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
_, img = cv2.threshold(img, threshold, 0, cv2.THRESH_TOZERO)
return img
path = 'test1.png'
img = cv2.imread(path, 0)
img = accessBinary(img)
cv2.imshow('accessBinary', img)
cv2.waitKey(0)
2、膨胀
膨胀是图像中的高亮部分进行膨胀,领域扩张,效果图拥有比原图更大的高亮区域。知道卷积运算的同学可以这样理解,他就是给定一个kernel,然后做maxpooling。我常用这个函数消除噪点
import cv2
path = 'test.jpg'
img = plt.imread(path)
# 膨胀
kernel = np.ones((3, 3), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
cv2.imshow('test_win', img)
cv2.waitKey(0)
3、腐蚀
腐蚀是图像中的高亮部分被腐蚀掉,领域缩减,效果图拥有比原图更小的高亮区域。腐蚀也是做卷积计算,不同于膨胀的的是腐蚀做的是最小值池化
import cv2
path = 'test.jpg'
img = plt.imread(path)
# 膨胀
kernel = np.ones((3, 3), np.uint8)
img = cv2.erode(img,kernel)(img, kernel, iterations=1)
cv2.imshow('test_win', img)
cv2.waitKey(0)
4、开运算和闭运算
开运算(Open Operation):先腐蚀后膨胀的过程。可以消除小物体,在纤细处分离物体;平滑较大的边界并不明显改变其面积;
闭运算(Closing Openration),先膨胀后腐蚀;排除小型黑洞(黑斑);
5、其他一些使用
import cv2
path = 'test.jpg'
img = plt.imread(path)
# 尺寸变换,转为300 * 300像素的图片
resize_img = cv2.resize(img , (300, 300))
# 裁剪,利用python的切片
cut_img = resize_img[100:200, 100:200]
# 画矩形,其中(100, 200), (300, 300)分别是左下角坐标, 右上角坐标,
rectangle_img = cv2.rectangle(img, (100, 200), (300, 300), (0, 0, 255))
# 画圆,其中(100, 200),1是半径,(0, 255, 0)颜色, 0是线宽
cv2.circle(img, (100, 200), 1, (0, 255, 0), 0)
# 写字,各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
cv2.putText(img, str(results[i]), border[0], cv2.FONT_HERSHEY_COMPLEX, 0.8, (0, 255, 0), 1)
总结
以上就是opencv经常用的一些函数,下面通过会介绍我自己做的几个例子,利用opencv来找出纸张的边缘并做转化示例等,链接