Python 利用OpenCV给照片换底色的示例代码


Posted in Python onAugust 03, 2020

OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。相比于PIL库来说OpenCV更加强大, 可以做更多更复杂的应用,比如人脸识别等。

1. 读入并显示图片

import cv2

# 读入图片
img = cv2.imread(r'D:\test\test_001.jpg', 1)

# 显示图像
cv2.imshow('img', img)

# 窗口等待命令 0表示无限等待
cv2.waitKey(0)

运行效果如下:

Python 利用OpenCV给照片换底色的示例代码

2. 缩放图片

import cv2
# 读入图片
img = cv2.imread(r'D:\test\test_001.jpg', 1)
rows, cols, channels = img.shape
print(rows, cols, channels)

new_img = cv2.resize(img, None, fx=0.5, fy=0.5)

rows, cols, channels = new_img.shape
print(rows, cols, channels)

# 显示图像
cv2.imshow('new_img', new_img)

# 窗口等待命令 0表示无限等待
cv2.waitKey(0)

将图片尺寸按比例缩小一半,运行效果如下:

Python 利用OpenCV给照片换底色的示例代码

3. 彩色图像转换为灰度图像

彩色图片有RGB三个颜色通道,无法进行腐蚀和膨胀的操作。这个就需要我们将彩色图片转换为hsv灰度图像后,再进行腐蚀和膨胀的操作。

import cv2

img = cv2.imread(r'D:\test\test_001.jpg', 1)
new_img = cv2.resize(img, None, fx=0.5, fy=0.5)

rows, cols, channels = new_img.shape
print(rows, cols, channels)

# 显示图像
cv2.imshow('new_img', new_img)

# 将图片转换为灰度图片
gray_img = cv2.cvtColor(new_img, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv', gray_img)
cv2.waitKey(0)

运行效果如下:

Python 利用OpenCV给照片换底色的示例代码

4. 图片二值化处理

二值化处理是为了将图片转换为黑白图片,目的是滤除太大或太小值像素、消除噪声,从而从灰度图中获取二值图像(将图像的灰度值设置为0或255),实现增强整个图像呈现更为明显的黑白效果,同时也大大减少了数据量。

import cv2
import numpy as np

img = cv2.imread(r'D:\test\test_001.jpg', 1)
new_img = cv2.resize(img, None, fx=0.5, fy=0.5)

rows, cols, channels = new_img.shape
print(rows, cols, channels)

# 显示图像
cv2.imshow('new_img', new_img)

# 将图片转换为灰度图片
gray_img = cv2.cvtColor(new_img, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv', gray_img)

# 图片二值化处理
low_value = np.array([90, 70, 70])
high_value = np.array([110, 255, 255])
binary_img = cv2.inRange(gray_img, low_value, high_value)
cv2.imshow('binary_img', binary_img)

cv2.waitKey(0)

运行效果如下:

Python 利用OpenCV给照片换底色的示例代码

5. 图像的腐蚀和膨胀

图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大;腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。

  • 图像被腐蚀后,去除了噪声,但是会压缩图像。
  • 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并且保持原有形状。
# 腐蚀膨胀
erode = cv2.erode(binary_img, None, iterations=1)
dilate = cv2.dilate(erode, None, iterations=1)
cv2.imshow('dilate', dilate)

6. 遍历像素点进行颜色替换

图像是由每一个像素点组成的,找到腐蚀后得到图片的白色底色处的像素点,然后将原图中对应位置处的像素点,替换为红色或者白色,即可实现给照片换底色。

import cv2
import numpy as np

img = cv2.imread(r'D:\test\test_001.jpg', 1)
new_img = cv2.resize(img, None, fx=0.5, fy=0.5)

rows, cols, channels = new_img.shape
print(rows, cols, channels)

# 显示图像
cv2.imshow('new_img', new_img)

# 将图片转换为灰度图片
gray_img = cv2.cvtColor(new_img, cv2.COLOR_BGR2HSV)

# 图片二值化处理
low_value = np.array([90, 70, 70])
high_value = np.array([110, 255, 255])
binary_img = cv2.inRange(gray_img, low_value, high_value)

# 腐蚀膨胀
erode = cv2.erode(binary_img, None, iterations=1)
dilate = cv2.dilate(erode, None, iterations=1)
# cv2.imshow('dilate', dilate)

# 遍历替换
for i in range(rows):
 for j in range(cols):
  if dilate[i, j] == 255:
  	# 此处替换颜色,为BGR通道
   new_img[i, j] = (0, 0, 255) # (0, 0, 255)替换为红底 (255, 255, 255)替换为白底

cv2.imshow('red_bg_img', new_img)
# 窗口等待命令 0表示无限等待
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果如下:

Python 利用OpenCV给照片换底色的示例代码
Python 利用OpenCV给照片换底色的示例代码

程序运行成功,可以将照片的蓝底换为红底或者白底,成功利用opencv实现给照片换底色。

7. 其他说明

测试所用图片来源于百度图片搜索,图片仅用于图像处理知识交流和学习,如有侵权请联系我删除!

到此这篇关于Python 利用OpenCV给照片换底色的示例代码的文章就介绍到这了,更多相关python照片换底色内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现的检测网站挂马程序
Nov 30 Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
在windows系统中实现python3安装lxml
Mar 23 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
Jan 10 Python
python+matplotlib演示电偶极子实例代码
Jan 12 Python
对pandas replace函数的使用方法小结
May 18 Python
使用python对文件中的单词进行提取的方法示例
Dec 21 Python
Python中正则表达式的用法总结
Feb 22 Python
Python Pandas分组聚合的实现方法
Jul 02 Python
Django模板标签中url使用详解(url跳转到指定页面)
Mar 19 Python
python删除指定列或多列单个或多个内容实例
Jun 28 Python
python如何在word中存储本地图片
Apr 07 Python
Python3基于plotly模块保存图片表格
Aug 03 #Python
详解Python的爬虫框架 Scrapy
Aug 03 #Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 #Python
Python pexpect模块及shell脚本except原理解析
Aug 03 #Python
python爬虫使用正则爬取网站的实现
Aug 03 #Python
python获取整个网页源码的方法
Aug 03 #Python
flask开启多线程的具体方法
Aug 02 #Python
You might like
网页游戏开发入门教程二(游戏模式+系统)
2009/11/02 PHP
php _autoload自动加载类与机制分析
2012/02/10 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
php计算年龄精准到年月日
2015/11/17 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
PHP使用反向Ajax技术实现在线客服系统详解
2019/07/01 PHP
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
2014/12/05 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
微信小程序wepy框架笔记小结
2018/08/08 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
使用Python的内建模块collections的教程
2015/04/28 Python
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
详解Python传入参数的几种方法
2019/05/16 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
python中wx模块的具体使用方法
2020/05/15 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
倩碧美国官网:Clinique美国
2016/07/20 全球购物
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
高一地理教学反思
2014/01/18 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
人代会简报
2015/07/21 职场文书
工商局调档介绍信
2015/10/22 职场文书