python cv2截取不规则区域图片实例


Posted in Python onDecember 21, 2019

知识掌握

cv2.threshold()函数:

设置固定级别的阈值应用于多通道矩阵,将灰度图像变换二值图像,或去除指定级别的噪声,或过滤掉过小或者过大的像素点。

Python: cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst

在其中:

src:表示的是图片源

thresh:表示的是阈值(起始值)

maxval:表示的是最大值

type:表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BINARY)

import cv2 

img = cv2.imread('1.jpg')
cv2.imshow("src", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, dst = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("dst", dst)
cv2.waitKey(0)

python cv2截取不规则区域图片实例

cv2.findContours()函数:

查找检测物体的轮廓

cv2.findContours(image, mode, method)

opencv2返回两个值:contours:hierarchy。

注:opencv3会返回三个值,分别是img, countours, hierarchy

在其中:

image:表示的是寻找轮廓的图像;

mode:表示的是轮廓的检索模式,有四种:

cv2.RETR_EXTERNAL表示只检测外轮廓

cv2.RETR_LIST检测的轮廓不建立等级关系

cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。

cv2.RETR_TREE建立一个等级树结构的轮廓。

method:表示的是轮廓的近似办法

cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1

cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

import numpy as np 
import cv2

rectangle = np.zeros((300,300),dtype="uint8")
cv2.rectangle(rectangle,(25,25),(275,275),255,-1)
cv2.imshow("Rectangle",rectangle)

img, countours, hierarchy = cv2.findContours(rectangle, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(countours)
print(hierarchy)
cv2.waitKey(0)

python cv2截取不规则区域图片实例

[array([[[ 25, 25]],
[[ 25, 275]],
[[275, 275]],
[[275, 25]]], dtype=int32)]

[[[-1 -1 -1 -1]]]

cv2.polylines函数:

绘制多边形

cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[,shift]]])

首先需要顶点坐标.将这些点转换为rowsx1x2形状的数组,其中rows是顶点数,它应该是int32类型。

import numpy as np
import cv2
# Create a black image
img = np.zeros((200, 200, 3), np.uint8)

pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32) # 每个点都是(x, y)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, (0, 255, 255))

pts = np.array([[100, 5], [150, 30], [80, 20], [90, 10]], np.int32)
cv2.polylines(img, [pts], False, (0, 255, 255))
cv2.imshow('img2', img)

cv2.waitKey()

如果第三个参数为False,您将获得连接所有点的折线,而不是闭合形状。

cv2.polylines()可用于绘制多条线.只需创建要绘制的所有行的列表并将其传递给函数, 所有线条都将单独绘制.绘制一组行比为每行调用cv2.line()要好得多,速度更快.

python cv2截取不规则区域图片实例

cv2.fillPoly)函数

可以用来填充任意形状的图型.可以用来绘制多边形,工作中也经常使用非常多个边来近似的画一条曲线.cv2.fillPoly()函数可以一次填充多个图型.

cv2.fillPoly(image,ppt,Scalar(255,255,255))

image:表示的是多边形将被画到image上

ppt:表示的是多边形的顶点集为ppt

Scalar:表示的是多边形的颜色定义为Scarlar(255,255,255),即RGB的值为白色

img = np.zeros((1080, 1920, 3), np.uint8)
area1 = np.array([[250, 200], [300, 100], [750, 800], [100, 1000]])
area2 = np.array([[1000, 200], [1500, 200], [1500, 400], [1000, 400]])
 
cv2.fillPoly(img, [area1, area2], (255, 255, 255))
 
plt.imshow(img)
plt.show()

python cv2截取不规则区域图片实例

按位操作-bitwise operations

import numpy as np 
import cv2

rectangle = np.zeros((300,300),dtype="uint8")
cv2.rectangle(rectangle,(25,25),(275,275),255,-1)
cv2.imshow("Rectangle",rectangle)

circle = np.zeros((300,300),dtype="uint8")
cv2.circle(circle,(150,150),150,255,-1)
cv2.imshow("Circle",circle)

bitwiseAnd = cv2.bitwise_and(rectangle,circle)
cv2.imshow("And",bitwiseAnd)

bitwiseOr = cv2.bitwise_or(rectangle,circle)
cv2.imshow("OR",bitwiseOr)

bitwiseXor = cv2.bitwise_xor(rectangle,circle)
cv2.imshow("XOR",bitwiseXor)

bitwiseNot = cv2.bitwise_not(rectangle)
cv2.imshow("Not",bitwiseNot)
cv2.waitKey(0)

如果一个给定的像素的值大于零,那么这个像素会被打开,如果它的值为零,它就会被关闭。按位功能在这些二进制条件下运行。

AND:当且仅当两个像素都大于零时,按位AND才为真。

OR:如果两个像素中的任何一个大于零,则按位“或”为真。

XOR 异或功能:当且仅当两个像素中的任何一个大于零时,按位XOR才为真,但不是两者都是。当且仅当两个像素一个大于0一个小于0时才为真,其他都为false

NOT 取反:倒置图像中的“开”和“关”像素。

python cv2截取不规则区域图片实例

# -*- coding: utf-8 -*-
 
import cv2
import numpy as np
global img
global point1, point2
 
lsPointsChoose = []
tpPointsChoose = []
 
pointsCount = 0
count = 0 
pointsMax = 5
 
lsPointsChoose = []
tpPointsChoose = []
 
pointsCount = 0
count = 0
pointsMax = 5

 
def on_mouse(event, x, y, flags, param):
  global img, point1, point2, count, pointsMax
  global lsPointsChoose, tpPointsChoose # 存入选择的点
  global pointsCount # 对鼠标按下的点计数
  global init_img, ROI_bymouse_flag
  init_img = img.copy() # 此行代码保证每次都重新再原图画 避免画多了

  if event == cv2.EVENT_LBUTTONDOWN: # 左键点击
 
    pointsCount = pointsCount + 1
    # 为了保存绘制的区域,画的点稍晚清零
    if(pointsCount == pointsMax + 1):
      pointsCount = 0
      tpPointsChoose = []
    print('pointsCount:', pointsCount)
    point1 = (x, y)
    print (x, y)
    # 画出点击的点
    cv2.circle(init_img, point1, 10, (0, 255, 0), 5)
 
    # 将选取的点保存到list列表里
    lsPointsChoose.append([x, y]) # 用于转化为darry 提取多边形ROI
    tpPointsChoose.append((x, y)) # 用于画点

    # 将鼠标选的点用直线链接起来
    print(len(tpPointsChoose))
    for i in range(len(tpPointsChoose) - 1):
      cv2.line(init_img, tpPointsChoose[i], tpPointsChoose[i + 1], (0, 0, 255), 5)
    # 点击到pointMax时可以提取去绘图
    if(pointsCount == pointsMax):
      # 绘制感兴趣区域
      ROI_byMouse()
      ROI_bymouse_flag = 1
      lsPointsChoose = []
 
    cv2.imshow('src', init_img)
    
  # 右键按下清除轨迹
  if event == cv2.EVENT_RBUTTONDOWN: # 右键点击
    print("right-mouse")
    pointsCount = 0
    tpPointsChoose = []
    lsPointsChoose = []
    print(len(tpPointsChoose))
    for i in range(len(tpPointsChoose) - 1):
      print('i', i)
      cv2.line(init_img, tpPointsChoose[i], tpPointsChoose[i + 1], (0, 0, 255), 5)
    cv2.imshow('src', init_img)


def ROI_byMouse():
  global src, ROI, ROI_flag, mask2
  mask = np.zeros(img.shape, np.uint8)
  pts = np.array([lsPointsChoose], np.int32)

  pts = pts.reshape((-1, 1, 2)) # -1代表剩下的维度自动计算

  # 画多边形
  mask = cv2.polylines(mask, [pts], True, (0, 255, 255))
  # 填充多边形
  mask2 = cv2.fillPoly(mask, [pts], (255, 255, 255))
  cv2.imshow('mask', mask2)
  ROI = cv2.bitwise_and(mask2, img)
  cv2.imshow('ROI', ROI)

  
def main():
  global img, init_img, ROI
  img = cv2.imread('1.jpg')  
 
  # 图像预处理,设置其大小  
  height, width = img.shape[:2]  
  size = (int(width * 0.3), int(height * 0.3)) 
  img = cv2.resize(img, size, interpolation=cv2.INTER_AREA)  
  ROI = img.copy()
  cv2.namedWindow('src')
  cv2.setMouseCallback('src', on_mouse)  
  cv2.imshow('src', img)
  cv2.waitKey(0)
  cv2.destroyAllWindows()


if __name__ == '__main__':
  main()

以上这篇python cv2截取不规则区域图片实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python判断变量是否已经定义的方法
Aug 18 Python
python简单程序读取串口信息的方法
Mar 13 Python
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
Python 3.x读写csv文件中数字的方法示例
Aug 29 Python
200 行python 代码实现 2048 游戏
Jan 12 Python
tensorflow输出权重值和偏差的方法
Feb 10 Python
numpy.delete删除一列或多列的方法
Apr 03 Python
基于pandas数据样本行列选取的方法
Apr 20 Python
Python实现随机漫步功能
Jul 09 Python
Django获取应用下的所有models的例子
Aug 30 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
django 前端页面如何实现显示前N条数据
Mar 16 Python
Python lxml模块的基本使用方法分析
Dec 21 #Python
python Manager 之dict KeyError问题的解决
Dec 21 #Python
tornado+celery的简单使用详解
Dec 21 #Python
Python selenium的基本使用方法分析
Dec 21 #Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 #Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 #Python
python支持多线程的爬虫实例
Dec 21 #Python
You might like
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
javascript中的缓动效果实现程序
2012/12/29 Javascript
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
JavaScript SHA512&SHA256加密算法详解
2015/08/11 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
BootStrap的table表头固定tbody滚动的实例代码
2016/08/24 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
常用的javascript设计模式
2017/01/11 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
2017/01/17 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
原生js实现获取form表单数据代码实例
2019/03/27 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
Python Django Cookie 简单用法解析
2019/08/13 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
Django Path转换器自定义及正则代码实例
2020/05/29 Python
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
.net笔试题
2014/03/03 面试题
新锐科技Java程序员面试题
2016/07/25 面试题
勤奋学习演讲稿
2014/05/10 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫