open-cv笔记

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]: <matplotlib.image.AxesImage at 0x1bd6c5c2780>
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]: <matplotlib.image.AxesImage at 0x1bd6afdb4a8>
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]: <matplotlib.image.AxesImage at 0x1bd6af6d5c0>
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)
    ...:
    ...:
mask.png
img_close.jpg
img_open.jpg
img_mark.jpg
rgb_contours.jpg
bbox.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容