用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开发利器之ulipad的使用实践
Mar 16 Python
Python解惑之整数比较详解
Apr 24 Python
python安装Scrapy图文教程
Aug 14 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
python获取地震信息 微信实时推送
Jun 18 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
Django的Modelforms用法简介
Jul 27 Python
如何基于python实现不邻接植花
May 01 Python
python爬取企查查企业信息之selenium自动模拟登录企查查
Apr 08 Python
Python Django ORM连表正反操作技巧
Jun 13 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
php 禁止页面缓存输出
2009/01/07 PHP
PHP中将数组转成XML格式的实现代码
2011/08/08 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
php画图实例
2014/11/05 PHP
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
页面加载完成后再执行JS的jquery写法以及区别说明
2014/02/22 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
2018/04/24 Python
Python如何发布程序的详细教程
2018/10/09 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
银行求职推荐信范文
2013/11/30 职场文书
文科毕业生自荐书范文
2014/04/17 职场文书
岗位说明书标准范本
2014/07/30 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
会议室管理制度范本
2015/08/06 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
班级班风口号大全
2015/12/25 职场文书
数学复习课教学反思
2016/02/18 职场文书