用opencv给图片换背景色的示例代码


Posted in Python onJuly 08, 2020

图像平滑

模糊/平滑图片来消除图片噪声

OpenCV函数:cv2.blur(), cv2.GaussianBlur(), cv2.medianBlur(), cv2.bilateralFilter()

2D 卷积

OpenCV中用cv2.filter2D()实现卷积操作,比如我们的核是下面这样(3×3区域像素的和除以10):

img = cv2.imread('lena.jpg')
# 定义卷积核
kernel = np.ones((3, 3), np.float32) / 10
# 卷积操作,-1表示通道数与原图相同
dst = cv2.filter2D(img, -1, kernel)

卷积操作,-1表示通道数与原图相同

dst = cv2.filter2D(img, -1, kernel)

定义卷## 标题积核

kernel = np.ones((3, 3), np.float32) / 10

卷积操作,-1表示通道数与原图相同

dst = cv2.filter2D(img, -1, kernel)

模糊和滤波

它们都属于卷积,不同滤波方法之间只是卷积核不同(对线性滤波而言)

低通滤波器是模糊,高通滤波器是锐化

常见噪声有 椒盐噪声 和 高斯噪声 ,椒盐噪声可以理解为斑点,随机出现在图像中的黑点或白点;高斯噪声可以理解为拍摄图片时由于光照等原因造成的噪声。

均值滤波

均值滤波是一种最简单的滤波处理,它取的是卷积核区域内元素的均值,用 cv2.blur() 实现,如3×3的卷积核:

img = cv2.imread('lena.jpg')
# 均值模糊
blur = cv2.blur(img,(3,3)

高斯滤波

不同于均值滤波,高斯滤波的卷积核权重并不相同:中间像素点权重最高,越远离中心的像素权重越小,类似于正态分布。

OpenCV中对应函数为 cv2.GaussianBlur(src,ksize,sigmaX) ,指定的高斯核的宽和高必须为奇数。

img = cv2.imread(‘gaussian_noise.bmp')

均值滤波vs高斯滤波

blur = cv2.blur(img, (5, 5)) # 均值滤波
gaussian = cv2.GaussianBlur(img, (5, 5), 1) # 高斯滤波

参数3,σx值越大,模糊效果越明显。高斯滤波相比均值滤波效率要慢,但可以有效消除高斯噪声,能保留更多的图像细节,所以经常被称为最有用的滤波器。

中值滤波
中值又叫中位数,是所有数排序后取中间的值。中值滤波就是用区域内的中值来代替本像素值,所以那种孤立的斑点,如0或255很容易消除掉,适用于去除椒盐噪声和斑点噪声。中值是一种非线性操作,效率相比前面几种线性滤波要慢。

img = cv2.imread(‘salt_noise.bmp', 0)

双边滤波
操作基本都会损失掉图像细节信息,尤其前面介绍的线性滤波器,图像的边缘信息很难保留下来。然而,边缘(edge)信息是图像中很重要的一个特征,所以这才有了双边滤波。用cv2.bilateralFilter()函数实现:

img = cv2.imread(‘lena.jpg')

形态学操作
包括膨胀、腐蚀、开运算和闭运算等形态学操作

OpenCV函数:cv2.erode(), cv2.dilate(), cv2.morphologyEx()

腐蚀
腐蚀的效果是把图片”变瘦”,其原理是在原图的小区域内取局部最小值。因为是二值化图,只有0和255,所以小区域内有一个是0该像素点就为0:

OpenCV中用cv2.erode()函数进行腐蚀,只需要指定核的大小就行:

import cv2
import numpy as np
img = cv2.imread(‘j.bmp', 0)
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel) # 腐蚀

这个核也叫结构元素,因为形态学操作其实也是应用卷积来实现的。结构元素可以是矩形/椭圆/十字形,可以用cv2.getStructuringElement()来生成不同形状的结构元素,比如:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 矩形结构
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) # 椭圆结构
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5)) # 十字结构

膨胀

膨胀与腐蚀相反,取的是局部最大值,效果是把图片”变胖”:

dilation = cv2.dilate(img, kernel) # 膨胀

开/闭运算

先腐蚀后膨胀叫开运算(因为先腐蚀会分开物体,这样容易记住),其作用是:分离物体,消除小区域。这类形态学操作用 cv2.morphologyEx() 函数实现:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
img = cv2.imread(‘j_noise_out.bmp', 0)

开运算

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

闭运算则相反:先膨胀后腐蚀(先膨胀会使白色的部分扩张,以至于消除/“闭合”物体里面的小黑洞,所以叫闭运算)

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

形态学梯度

膨胀图减去腐蚀图,dilation - erosion,这样会得到物体的轮廓:

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

顶帽
原图减去开运算后的图:src - opening

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

黑帽
闭运算后的图减去原图:closing - src

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

给图片换背景的源代码。欢迎一起学习的小伙伴指教!

#imagechuli
import cv2
import time
import numpy as np

#图片名子
name = "1.jpg"
#程序计时
start = time.perf_counter()
#显示图片
img=cv2.imread("./input_image/3.jpg")
#图片缩放
img = cv2.resize(img,None,fx = 0.5,fy = 0.5)
rows,cols,channels = img.shape
#print(rows,cols,channels)
cv2.resizeWindow("origin", 0, 0);
#cv2.imshow("origin",img)
#转换为二值化图像
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
rows,cols,channels = hsv.shape
 
#图片的二值化处理
lower_blue = np.array([90,70,70])
upper_blue = np.array([110,255,255])
mask = cv2.inRange(hsv,lower_blue,upper_blue)

def shap():
 
 #图像的腐蚀
 kernel = np.ones((4, 4), np.uint8)
 erode=cv2.erode(mask,kernel,iterations=1)
 #cv2.imshow("erode",erode)
 
 #膨胀操作
 kernel = np.ones((2, 2), np.uint8)
 dilate=cv2.dilate(erode,None,iterations=3)
 #cv2.imshow("dilate",dilate)
 #循环遍历
 for i in range(rows):
  for j in range(cols):
   if dilate[i,j]==255:
    img[i,j]=(0,0,255)#注意是BGR通道,不是RGB
 #cv2.imshow("res",img)
 bianyuanchuli()
 
 #cv2.destroyAllWindows()
 
def bianyuanchuli():
 #图像边缘检测的内核大小
 data = (900,1100)
 img_copy = img.copy()
 imgCanny = cv2.Canny(img, *data)
 #cv2.imshow("imgcanny",imgCanny)
 # 创建矩形结构
 g = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
 g2 = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
 # 膨化处理
 # 更细腻
 img_dilate = cv2.dilate(imgCanny, g,iterations=1)
 #cv2.imshow("img_dilate",img_dilate)
 # 更粗大
 img_dilate2 = cv2.dilate(imgCanny, g2)

 shape = img_dilate.shape
 # 提取
 for i in range(shape[0]):
  for j in range(shape[1]):
   if img_dilate2[i, j] == 0: # 二维定位到三维
    img[i, j] = [0, 0, 0]
 #cv2.imshow('dst1', img)
 
 dst = cv2.GaussianBlur(img, (3, 3), 0, 0, cv2.BORDER_DEFAULT)

 for i in range(shape[0]):
  for j in range(shape[1]):
   if img_dilate[i, j] != 0: # 二维定位到三维
    img_copy[i, j] = dst[i, j]

 #cv2.imshow('dst', img_copy)
 cv2.imwrite("./out_image/3.jpg",img_copy) 
 shap()
# 窗口等待的命令,0表示无限等待
cv2.destroyAllWindows()
cv2.waitKey(0)
dur = time.perf_counter() - start
print("程序总用时:{:.2f}s".format(dur))

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

Python 相关文章推荐
Python描述器descriptor详解
Feb 03 Python
Python爬取读者并制作成PDF
Mar 10 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
Python动态导入模块的方法实例分析
Jun 28 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
Python Pandas 转换unix时间戳方式
Dec 07 Python
python中设置超时跳过,超时退出的方式
Dec 13 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
Python通过文本和图片生成词云图
May 21 Python
jupyter notebook指定启动目录的方法
Mar 02 Python
python文件及目录操作代码汇总
Jul 08 #Python
Python预测2020高考分数和录取情况
Jul 08 #Python
Python venv虚拟环境配置过程解析
Jul 08 #Python
Python如何实现自带HTTP文件传输服务
Jul 08 #Python
Python第三方包PrettyTable安装及用法解析
Jul 08 #Python
简单了解如何封装自己的Python包
Jul 08 #Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 #Python
You might like
基于mysql的论坛(6)
2006/10/09 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
jQuery chili图片远处放大插件
2009/11/30 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
JS判断一个数是否是水仙花数
2017/06/11 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
python利用有道翻译实现"语言翻译器"的功能实例
2017/11/14 Python
python计算列表内各元素的个数实例
2018/06/29 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
python能做哪方面的工作
2020/06/15 Python
Python二元算术运算常用方法解析
2020/09/15 Python
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
体育口号大全
2014/06/18 职场文书
2015年市场部工作总结
2015/04/30 职场文书
总经理年会致辞
2015/07/29 职场文书
Oracle笔记
2021/04/05 Oracle
vue特效之翻牌动画
2022/04/20 Vue.js
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android