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文件和流(实例讲解)
Sep 12 Python
详解TensorFlow在windows上安装与简单示例
Mar 05 Python
python实现12306抢票及自动邮件发送提醒付款功能
Mar 08 Python
python中单例常用的几种实现方法总结
Oct 13 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
基于python的ini配置文件操作工具类
Apr 24 Python
Django 外键的使用方法详解
Jul 19 Python
使用Python制作一个打字训练小工具
Oct 01 Python
python实现串口通信的示例代码
Feb 10 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
Apr 16 Python
详解基于python的全局与局部序列比对的实现(DNA)
Oct 07 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验证码类分享
2014/11/18 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
2020/12/15 PHP
Jquery 点击按钮显示和隐藏层的代码
2011/07/25 Javascript
js实时获取系统当前时间实例代码
2013/06/28 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
js表单登陆验证示例
2016/10/19 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
市场营销专业个人求职信范文
2013/12/14 职场文书
授权委托书格式模板
2014/04/03 职场文书
六年级学生评语
2014/04/22 职场文书
个人求职自荐信范文
2014/06/20 职场文书
党员创先争优心得体会
2014/09/11 职场文书
委托证明书
2014/09/17 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
前台岗位职责
2015/02/13 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
创业计划书之电动车企业
2019/10/11 职场文书
MySQL外键约束(FOREIGN KEY)案例讲解
2021/08/23 MySQL
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS