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 31 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
Python基于opencv的图像压缩算法实例分析
May 03 Python
Python sorted函数详解(高级篇)
Sep 18 Python
Python使用Selenium爬取淘宝异步加载的数据方法
Dec 17 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
详解Python实现进度条的4种方式
Jan 15 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
使用python实现飞机大战游戏
Mar 23 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
Jun 12 Python
keras的load_model实现加载含有参数的自定义模型
Jun 22 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制作静态网站的模板框架(一)
2006/10/09 PHP
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
小文件php+SQLite存储方案
2010/09/04 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
利用ES6语法重构React组件详解
2017/03/02 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
Python类的专用方法实例分析
2015/01/09 Python
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
django之session与分页(实例讲解)
2017/11/13 Python
python实现kNN算法
2017/12/20 Python
在Python中定义一个常量的方法
2018/11/10 Python
Python函数式编程指南:对生成器全面讲解
2019/11/19 Python
通过Python实现一个简单的html页面
2020/05/16 Python
谈谈python垃圾回收机制
2020/09/27 Python
HTML5的语法变化介绍
2013/08/13 HTML / CSS
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
求职推荐信范文
2013/12/01 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
Vue监视数据的原理详解
2022/02/24 Vue.js
对象析构函数__del__在Python中何时使用
2022/03/22 Python