用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 sys模块sys.path使用方法示例
Dec 04 Python
pygame实现弹力球及其变速效果
Jul 03 Python
基于python指定包的安装路径方法
Oct 27 Python
python实现桌面壁纸切换功能
Jan 21 Python
Python Pandas数据结构简单介绍
Jul 03 Python
Python传递参数的多种方式(小结)
Sep 18 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
Python Pandas 对列/行进行选择,增加,删除操作
May 17 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
Jun 02 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
python tkinter模块的简单使用
Apr 07 Python
Python数据可视化之绘制柱状图和条形图
May 25 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中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
PHP获取文件行数的方法
2015/06/10 PHP
PHP安全下载文件的方法
2016/04/07 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
javascript实现前端input密码输入强度验证
2020/06/24 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
Python中的高级函数map/reduce使用实例
2015/04/13 Python
深入理解Python中变量赋值的问题
2017/01/12 Python
Python with语句和过程抽取思想
2019/12/23 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
个人简历自我鉴定
2013/10/11 职场文书
体育课课后反思
2014/04/24 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
学风建设主题班会
2015/08/17 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
详解Python requests模块
2021/06/21 Python
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang