Python——OpenCV库的学习(十一):图像轮廓

笔记和用法都在代码注释中:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
#
# img = cv.imread('heibai.jpg',cv.IMREAD_GRAYSCALE)
# # img = cv.resize(img,(500,500))
# img1 = cv.imread('666.jpg')

# 阈值处理!!!!:
# ret,thresh = cv.threshold(img,125,255,cv.THRESH_BINARY)

# -----------------检测一下:阈值处理的效果
# cv.imshow('thresh',thresh)
# cv.waitKey(0)
# cv.destroyAllWindows()
#
# 对图像处理之后,就可以进行轮廓处理!!!!
# contours, hierarchy = cv.findContours(thresh,cv.RETR_TREE,cv.CHAIN_APPROX_NONE)
# ----------#contours就会存储轮廓信息!!!
# 接下来就把轮廓画到图像中!!
# cv.drawContours(img,contours,-1,(0,0,255),2)  #在img的基础上,画上!!!(这里为什么我画的轮廓是白色?我明明设置的是红色啊!!!)
# cv.drawContours(img,contours,-1,(0,0,255),2)  #原来是img为单通道图像,我怎么可以画为轮廓线颜色为三通道的呢?
# cv.drawContours(img1,contours,-1,(0,200,255),2)   #那么我重新读取一个不是经过黑白处理过的图像,我就可以在这个图像的基础上 画出他的轮廓了!!!!
#                                                 #这里:划重点!!!就算你重新读取一个彩色图像,也是可以画的,以为轮廓已经成功储存!!!并且可以任意改变颜色
# cv.imshow('img',img1)
# cv.waitKey(0)                                 #到这里,我们就可以随意制作别人的轮廓了,嘿嘿!!!!
#                                             (你只需要把轮廓画到提前准备好的一张白板照片上,就可以了!!)【反正只要不是经过单通道处理的那种就行!!】
# cv.destroyAllWindows()                        #但是那个轮廓。。。做出来有点吓人。。。。
# #
# 当然,我们也可以用定义一个变量,来接受那个图像!!!但是: 依然在img上进行操作,img也会进行改变!!!!
# res = cv.drawContours(img1,contours,-1,(0,0,255),2)  #在img的基础上,画上!!!(因为我的原图是黑白图,那么我就用白色来画轮廓!!)
# cv.imshow('res',res)                                   #如果不想在原图img上进行画轮廓,我们可以进行复制一份!!(code: img2 = img.copy()  )
# cv.waitKey(0)
# cv.destroyAllWindows()
#
# -----------------绘制轮廓的时候,我们可以通过改变相应的参数,修改轮廓粗细,颜色:
# res = cv.drawContours(thresh,contours,-1,(255,255,255),5)  #这里我把线条的粗细程度修改为了5
# cv.imshow('res',res)                        #如果不想在原图img上进行画轮廓,我们可以进行复制一份!!(code: img2 = img.copy()  )
# cv.waitKey(0)
# cv.destroyAllWindows()



# ------------------------cv.findContours(img,mode,method)----------
# 上面mode的方式有:
# -----RETR_EXTERNAL : 只检索最外面的轮廓
# -----RETR_LIST : 检查所有的轮廓,并将其保存到一条链表当中
# -----RETR_CCOMR : 检索所有的轮廓,并将他们组织为两层,顶层是各部分的外部边界,第二层是空洞的边界
# -----RETR_TREE : 检索所有的轮廓,并重构嵌套轮廓的整个层次   -----(这个方式最常用!!!!)----

# method: 轮廓逼近方法!!!!:
# -------CHAIN_APPROX_NONE: 以Freeman链码的方式输出轮廓
# -------CHAIN_APPROX_SIMPLE: 压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分!!

#--------------------------------------------------------轮廓特征!!!
# img = cv.imread('heibai.jpg')
# img = cv.resize(img,(500,500))
#
# gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# ret,thresh = cv.threshold(gray,125,255,cv.THRESH_BINARY)
# contours, hierarchy = cv.findContours(thresh,cv.RETR_TREE,cv.CHAIN_APPROX_NONE)
# cnt = contours[0]       #第一个轮廓!!!也可以【1】【2】
# area = cv.contourArea(cnt)     #计算轮廓面积!!!
# lenth = cv.arcLength(cnt,True) #计算周长(true代表轮廓是闭合的!!!)
#
# #--------------------------------------------------------轮廓近似!!!
#
# epsilon = 0.01*cv.arcLength(cnt,True)          #这里的0.01是可以变化的参数,越大的话,轮廓线就越短!!!(我们的彩色图像是画不出轮廓的!!!)
# approx = cv.approxPolyDP(cnt,epsilon,True)              #毕竟单通道怎么能画出三通道的轮廓线呢??!!
#
# draw_img = img.copy()
#
# res = cv.drawContours(draw_img,[approx],-1,(0,0,255),2)
#
# cv.imshow('res',res)                        #如果不想在原图img上进行画轮廓,我们可以进行复制一份!!(code: img2 = img.copy()  )
# cv.waitKey(0)
# cv.destroyAllWindows()

#-----------------------------------------个人图像轮廓制作练习--------------------------------

img = cv.imread('me.jpg')
white = cv.imread('white.jpg')

gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

ret,thresh = cv.threshold(gray,125,255,cv.THRESH_BINARY)

contours, hierarchy = cv.findContours(thresh,cv.RETR_TREE,cv.CHAIN_APPROX_NONE)

cv.drawContours(white,contours,-1,(0,0,0),-1)
                    #第一个参数: 设置基础图像
                    #第二个参数: 轮廓图像
                    #第三个参数: 设置轮廓样式 : (0 :只画出轮廓的外面,里面不画 ; -1 : 画出全部的轮廓)
                    #第四个参数: 设置画笔的大小 : -1是填充轮廓, 1或者大于1就是画笔的粗细( 轮廓的粗细)
cv.imshow('img',white)
cv.waitKey(0)
cv.destroyAllWindows()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pan_peter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值