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实现网页链接提取的方法分享
Feb 25 Python
Python 3.x 新特性及10大变化
Jun 12 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
pandas的唯一值、值计数以及成员资格的示例
Jul 25 Python
python+unittest+requests实现接口自动化的方法
Nov 29 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
Django获取应用下的所有models的例子
Aug 30 Python
python文字转语音的实例代码分析
Nov 12 Python
python 遗传算法求函数极值的实现代码
Feb 11 Python
Python Numpy 控制台完全输出ndarray的实现
Feb 19 Python
python excel多行合并的方法
Dec 09 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的addAll支持的最大数据量
2015/02/03 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
jQuery表单域选择器用法分析
2015/02/10 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
Python中for循环详解
2014/01/17 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
使用Python构建Hopfield网络的教程
2015/04/14 Python
详解Django的CSRF认证实现
2018/10/09 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
Python跳出多重循环的方法示例
2019/07/03 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
美国在线珠宝商店:SZUL
2017/02/11 全球购物
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
幼儿教师考核制度
2014/01/25 职场文书
大专生找工作自荐书
2014/06/10 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS
Vue2.0搭建脚手架
2022/03/13 Vue.js