OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。
此处仅为opencv学习使用笔记。
In [1]: import cv2
##########################
#读入图像
In [3]: img = cv2.imread('tumor_068.rgb.jpg')
In [4]: img
Out[4]:
array([[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[254, 254, 254]],
[[254, 254, 254],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[254, 254, 254]],
[[253, 253, 253],
[254, 254, 254],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[254, 254, 254]],
...,
# 可以看到图像读入后是一个 色彩rgb多维数组,长848,宽382, 3表示rgb三种色彩通道
In [4]: img.shape
Out[4]: (848, 382, 3)
#########################
# 显示图像
In [5]: cv2.imshow('Image', img)
# 还要加上下面这一句,如果不添,在IDLE中执行窗口直接无响应。在命令行中执行的话,则是一闪而过
In [6]: cv2.waitKey (0)
# 最后释放窗口
In [7]: cv2.destroyAllWindows()
#########################
# 色彩通道转换
# rgb色彩模式数组数组转换为bgr色彩模式数组
In [9]: bgr = img[...,[2,0,1]]
# bgr色彩模式数组转换为hsv色彩模式数组
In [10]: hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV)
#########################
# 构建掩模
In [11]: import numpy as np
In [12]: lower = [45, 45, 45]
In [13]: upper = [200, 200, 200]
In [16]: lower_red = np.array(lower)
In [17]: upper_red = np.array(upper)
# 颜色范围二值化,这里用的是cv2.inRange(hsv, lower_red, upper_red)函数,
# 函数的三个参数值hsv表示图像的hsv数组,
# lower_red和upper_red分别表示上下阈值,
# 在lower~upper之间的值变为255,而在之外的位置值则设置为0
In [19]: mask = cv2.inRange(hsv, lower_red, upper_red)
In [21]: mask.shape
Out[21]: (848, 382)
# 查看下掩模处理后的图片
In [23]: plt.imshow(mask)
Out[23]:
In [24]: plt.show() # 见下图 mask.png
################################
# 图像处理——开处理和闭处理
In [25]: size1 = (7, 7)
In [26]: size2 = (5, 5)
In [28]: kernel1 = np.ones(size1, dtype=np.uint8)
In [29]: kernel2 = np.ones(size2, dtype=np.uint8)
# 闭处理,结果见图 img_close.png
In [30]: img_close = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel1)
In [31]: img_close
Out[31]:
array([[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]], dtype=uint8)
In [32]: plt.imshow(img_close)
Out[32]:
In [33]: plt.show() # 见图 img_close.png
# 开处理
In [34]: img_open = cv2.morphologyEx(img_close, cv2.MORPH_OPEN, kernel2)
In [35]: plt.imshow(img_open)
Out[35]:
In [36]: plt.show() # 见图 img_open.png
###############################
# 找出图像轮廓
# cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])函数用来寻找图像轮廓,
# 他返回三个值:标记轮廓后的图像,总轮廓数,轮廓之间的关系的矩阵
# 参数:第一个参数是寻找轮廓的图像;
# 第二个参数表示轮廓的检索模式;
# 第三个参数method为轮廓的近似办法;
# 最后值得注意的是,第一个参数数组值必须是二值化的;而且,函数运行后会对原始图像进行更改(?)
In [54]: img_mark, cnts, hierarchy = cv2.findContours(img_open, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
In [58]: cv2.imshow('Image', img_mark) # 查看函数返回的图像 img_mark.png
# 画出图像轮廓
# cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])
# 参数:第一个参数是指明在哪幅图像上绘制轮廓;
# 第二个参数是轮廓本身,在Python中是一个list。
# 第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。
# 后面的参数很简单,其中thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。
# 先找出外部轮廓
In [80]: _img, contours, hera_ = cv2.findContours(img_open, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
In [81]: img_ = img.copy() # 复制原始图片数组
# 绘制外部轮廓
In [83]: cv2.drawContours(img_, contours, -1, (255, 0, 0), 2)
Out[83]:
array([[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[254, 254, 254]],
[[254, 254, 254],
[255, 255, 255],
[255, 255, 255],
...,
[255, 255, 255],
[255, 255, 255],
[254, 254, 254]],
...
In [84]: cv2.imshow('Image', img_) # 结果见图 rgb_contours.jpg
# cv2.boundingRect() 矩形边框(Bounding Rectangle)是说,用一个最小的矩形,把找到的形状包起来。返回一个最小矩形框。
# 可以通过一个小例子来更加形象的查看这个函数的作用
In [87]: contours[1]
Out[87]:
array([[[311, 644]],
[[311, 648]],
[[312, 649]],
[[312, 652]],
[[313, 653]],
[[317, 653]],
[[317, 647]],
[[316, 646]],
[[316, 644]]], dtype=int32)
In [88]: c1 = contours[1]
In [89]: cv2.boundingRect(c1)
Out[89]: (311, 644, 7, 10)
In [90]: boundingBoxes = [cv2.boundingRect(c) for c in contours]
In [91]: img_bbox = img.copy()
# 绘制boundingbox,结果见图 bbox.jpg
In [92]:for bounding_box in boundingBoxes:
...: x = int(bounding_box[0])
...: y = int(bounding_box[1])
...: cv2.rectangle(img_bbox, (x, y), (x + bounding_box[2], y + bounding_box[3]), color=(0, 0, 255), thickness=2)
...:
...: