问题引入

在小强学Python+OpenCV之-1.4.2裁剪一节,我们使用的是numpy数组切片功能实现图片区域的裁剪。

那么,如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢?

答案是,使用掩膜(masking)。

但是这一节我们先看一下掩膜的基础。图像的位运算。

代码

编写python脚本masking.py如下:

# 导入库
import numpy as np
import argparse
import cv2# 构建参数解析器
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())# 加载猫的图像
image = cv2.imread(args["image"])
cv2.imshow("Cat", image)# 创建矩形区域,填充白色255
rectangle = np.zeros(image.shape[0:2], dtype = "uint8")
cv2.rectangle(rectangle, (25, 25), (275, 275), 255, -1)
cv2.imshow("Rectangle", rectangle)# 创建圆形区域,填充白色255
circle = np.zeros(image.shape[0:2], dtype = "uint8")
cv2.circle(circle, (150, 150), 150, 255, -1)
cv2.imshow("Circle", circle)# 在此例(二值图像)中,以下的0表示黑色像素值0, 1表示白色像素值255
# 位与运算,与常识相同,有0则为0, 均无0则为1
bitwiseAnd = cv2.bitwise_and(rectangle, circle)
cv2.imshow("AND", bitwiseAnd)
cv2.waitKey(0)# 或运算,有1则为1, 全为0则为0
bitwiseOr = cv2.bitwise_or(rectangle, circle)
cv2.imshow("OR", bitwiseOr)
cv2.waitKey(0)# 非运算,非0为1, 非1为0
bitwiseNot = cv2.bitwise_not(circle)
cv2.imshow("NOT", bitwiseNot)
cv2.waitKey(0) # 异或运算,不同为1, 相同为0
bitwiseXor = cv2.bitwise_xor(rectangle, circle)
cv2.imshow("XOR", bitwiseXor)
cv2.waitKey(0)

效果

运行脚本:

相信大家看到效果,再结合代码可以很容易理解。

裁剪

下面,我们利用OR结果(有点像猫的头像轮廓)把本课的主题图片中的猫的头像剪切出来。

我们需要修改一下,矩形区域的大小,去掉下边的两个角。

cv2.rectangle(rectangle, (25, 25), (275, 220), 255, -1)

最终调整后的代码如下:

# 导入库
import numpy as np
import argparse
import cv2# 构建参数解析器
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())# 加载猫的图像
image = cv2.imread(args["image"])
cv2.imshow("Cat", image)# 创建矩形区域,填充白色255
rectangle = np.zeros(image.shape[:2], dtype = "uint8")
cv2.rectangle(rectangle, (380, 100), (575, 200), 255, -1)
cv2.imshow("Rectangle", rectangle)# 创建圆形区域,填充白色255
circle = np.zeros(image.shape[:2], dtype = "uint8")
cv2.circle(circle, (475, 180), 105, 255, -1)
cv2.imshow("Circle", circle)# 或运算
bitwiseOr = cv2.bitwise_or(rectangle, circle)
cv2.imshow("OR", bitwiseOr)
cv2.waitKey(0)mask = bitwiseOr
cv2.imshow("Mask", mask)# Apply out mask -- notice how only the person in the image is cropped out
masked = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("Mask Applied to Image", masked)
cv2.waitKey(0)

运行得到

得到:

我们“近似”得到了猫的头像。

总结

1. 与或非异或运算与我们的常识类似。

2. 掩膜操作就是两幅图像(numpy数组)的位运算操作。

python异或运算怎么算_小强学Python+OpenCV之-1.4.4掩膜mask及位运算(与、或、非、异或)...相关推荐

  1. c++ opencv 识别车牌_小强学Python+OpenCV之-1.0开篇

    写在前面: 有没有想过使用Python + OpenCV来实现人脸识别? 想想就有点小兴奋吧. 小强也是不久前才了解到可以使用Python + OpenCV进行图像处理.觉得有趣就想学习一下. 在这里 ...

  2. 小强学Python+OpenCV之-1.4.4掩膜mask及位运算

    原文:http://blog.csdn.net/eric_pycv/article/details/72887748 问题引入 在1.4.3裁剪一节,我们使用的是numpy数组切片功能实现图片区域的裁 ...

  3. python语言流程控制语句的格式_慢步学python,编程基础知识,流程控制语句if

    慢步业余学python编程,今天休息继续分享python编程知识. 面向过程编程,重要的是程序的流程,今天说说流程控制语句if. 在我们高中数学中就有流程图的学习,只是没有真正应用起来而已,办公软件也 ...

  4. python小白应该看什么书_小白学python看什么书

    适合小白阅读的python入门书有 <Python编程 从入门到实战> 本书中涵盖的内容是比较精简的,没有艰深晦涩的概念,最重要的是每个小结都附带有"动手试一试"环节, ...

  5. opencv 把3通道图像转成单通道_小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算

    引入 问题引入,考虑以下几个问题: Q1. 一个3通道像素p的BGR分量(8bit表示)值均相同,那么这个像素是什么颜色的? Q2. 该像素p加上自己,即,像素p的各个通道值翻倍,那么这个像素的颜色会 ...

  6. python的read函数调用报错_从零开始学Python(七):文件存储I/O流和异常捕捉

    这两天在搞小程序开发,耽搁了一下更新的进度,今天补上.一个完整的前端程序肯定离不开数据存储和网络两个模块,今天我们就先来讲讲python中的一种常见数据存储:文件存储!~! 文件存储(I/O操作) 何 ...

  7. python在路径里添加变量_想学Python?那就先从头开始吧!

    作为人工智能和大数据时代最具竞争力的 Python 语言,越来越多的出现在各大编程热搜排行榜上. 首先你要了解什么是python 了解Python语言 Python是一种解释型, 面向对象, 动态数据 ...

  8. python使用字典描述学生信息_一起学Python:字典介绍

    字典介绍 想一想: 如果有列表 nameList = ['xiaoZhang', 'xiaoWang', 'xiaoLi']; 需要对"xiaoWang"这个名字写错了,通过代码修 ...

  9. 用python做股票量化分析豆瓣_小白学 Python 爬虫(24):2019 豆瓣电影排行

    人生苦短,我用 Python 前文传送门: 引言 从本篇的标题各位同学应该已经猜到了,本篇又到了实战环节~~~ 2019 已经快过完了,按照本文推送的时间预估,到 2020 应该还有十来天的时间,又到 ...

最新文章

  1. python 7-10梦想的度假胜地_7-8----7-10练习
  2. asp.net序列化
  3. 顶会论文轮番炸场,本周哪些论文最值得读?
  4. 重口味动漫_每种口味的图标样式
  5. [JavaWeb-Servlet]Servlet中的生命周期方法(init,service,destroy)
  6. 基于jsf的项目_JSF基于事件的沟通:过时的方法
  7. 40个新鲜出炉的 jQuery 插件和免费教程【上篇】 转载自:梦想天空
  8. C# 中的 is 和 as 运算符 简单举例说明
  9. php查询记录是否存在,php – 如果记录存在,我可以更新记录,如果不存在,可以在单个查询中更新多行吗?...
  10. 4G模块使用记录移远EC20、BC20
  11. centos安装libconfig
  12. 自动跳动滑动门html,CSS如何实现滑动门效果_html/css_WEB-ITnose
  13. 谷歌生物医学翻译软件_翻译器可翻译方言和文言文 超出谷歌微软的翻译软件能力...
  14. Python 结合bat批处理文件 实现密码保管箱
  15. arduino-解决舵机与直流电机冲突问题
  16. C# Word 悬挂缩进 首行缩进 的设置
  17. getch计算机错误,为什么getch()在C中抛出一个错误
  18. 怎么删除w7桌面计算机图标,桌面无法删除的图标,小编教你win7桌面图标删不掉怎么办...
  19. Android studio 安装配置SDK
  20. 2018航电多校练习第9场-快速幂

热门文章

  1. 【Docker】Asp.net core在docker容器中的端口问题
  2. 揭秘软件开发的达摩克利斯之剑
  3. ASP.NET Core 5.0新增功能摘要
  4. C#并发编程之初识并行编程
  5. 推荐一个集录屏、截图、音频于一体的软件给大家
  6. 开源、免费、企业级的SiteServer CMS .NET CORE 7.0 预览版发布
  7. .NET Core开发实战(第12课:配置变更监听)--学习笔记
  8. 面对金九银十铜十一你真的准备好了吗?
  9. C# 8.x 先睹为快
  10. .NET Core 3.0 可回收程序集加载上下文