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处理XML文件的方法
Aug 31 Python
Python的GUI框架PySide的安装配置教程
Feb 16 Python
使用Python写一个贪吃蛇游戏实例代码
Aug 21 Python
用Python读取几十万行文本数据
Dec 24 Python
Python编写带选项的命令行程序方法
Aug 13 Python
Python测试Kafka集群(pykafka)实例
Dec 23 Python
Python基于yaml文件配置logging日志过程解析
Jun 23 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 Python
python操作微信自动发消息的实现(微信聊天机器人)
Jul 14 Python
python实现xml转json文件的示例代码
Dec 30 Python
python实现计算图形面积
Feb 22 Python
python 离散点图画法的实现
Apr 01 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包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
javascript smipleChart 简单图标类
2011/01/12 Javascript
分享20款好玩的jQuery游戏
2011/04/17 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
JSON 数据格式详解
2017/09/13 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
Django中使用group_by的方法
2015/05/26 Python
Python内置函数delattr的具体用法
2017/11/23 Python
浅谈numpy库的常用基本操作方法
2018/01/09 Python
Python 中Pickle库的使用详解
2018/02/24 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
UML设计模式笔试题
2014/06/07 面试题
怎么写好自荐书
2014/03/02 职场文书
学校政风行风整改方案
2014/10/25 职场文书
幼儿园开学报名通知
2015/07/16 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书