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多线程扫描端口示例
Jan 16 Python
使用Python写CUDA程序的方法
Mar 27 Python
python Pandas 读取txt表格的实例
Apr 29 Python
python使用turtle库绘制时钟
Mar 25 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
Django 查询数据库并返回页面的例子
Aug 12 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
Jan 08 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
Selenium自动化测试工具使用方法汇总
Jun 12 Python
python中return如何写
Jun 18 Python
Python绘制散乱的点构成的图的方法
Apr 21 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
PHP分页效率终结版(推荐)
2013/07/01 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
异步加载script的代码
2011/01/12 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
echart简介_动力节点Java学院整理
2017/08/11 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
python+logging+yaml实现日志分割
2019/07/22 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
Linux的主要特性
2014/10/06 面试题
古汉语文学求职信范文
2014/03/16 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
通知范文怎么写
2015/04/16 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
CentOS安装Nginx并部署vue
2022/04/12 Servers