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日志模块logging简介
Apr 13 Python
Python实现购物车功能的方法分析
Nov 10 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
详解python编译器和解释器的区别
Jun 24 Python
Python 函数list&read&seek详解
Aug 28 Python
简单了解Python读取大文件代码实例
Dec 18 Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 Python
Python类中self参数用法详解
Feb 13 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
Apr 30 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
linux系统下pip升级报错的解决方法
Jan 31 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
ThinkPHP分页实例
2014/10/15 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
jQuery+ajax中getJSON() 用法实例
2014/12/22 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
python利用装饰器进行运算的实例分析
2015/08/04 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
介绍一下OSI七层模型
2012/07/03 面试题
趣味运动会活动方案
2014/02/12 职场文书
考试作弊检讨书大全
2014/02/18 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
计算机毕业生求职信
2014/06/10 职场文书
出售房屋协议书范本
2014/10/06 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
本溪水洞导游词
2015/02/11 职场文书
先进个人总结范文
2015/02/15 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
SQL Server数据库基本概念、组成、常用对象与约束
2022/03/20 SQL Server