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

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σ_xσ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给图片换背景色为例相关推荐

  1. python怎么换背景颜色_用opencv给图片换背景色的示例代码

    图像平滑 模糊/平滑图片来消除图片噪声 OpenCV函数:cv2.blur(), cv2.GaussianBlur(), cv2.medianBlur(), cv2.bilateralFilter() ...

  2. Python+OpenCV图像处理(二)——打印图片属性、设置图片存储路径、电脑摄像头的调取和显示...

    一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的Python科学计算库 ...

  3. OpenCV图像处理——GUI功能(三)

    OpenCV图像处理 文章目录 OpenCV图像处理 一.绘图功能 二.给图像加文字 三.用鼠标作为画笔 四.作为调色板的跟踪栏 总结 一.绘图功能 学习这些函数:**cv.line(), **cv. ...

  4. 210322阶段三QT事件循环及opencv图像处理

    目录 一.学习的知识点 1.QT事件循环机制 1.1QT是事件驱动的.QT将系统产生的信号(软件中断)转换成QT事件,并且将事件封装成类,所有的事件类都是QEvent派生的,事件的产生和处理就是QT程 ...

  5. OpenCV图像处理——GUI功能(二)

    OpenCV图像处理 文章目录 OpenCV图像处理 一.图像入门 1.读取图像 2.显示图像 3.保存图像 二.视频入门 1.用相机捕捉视频 2.播放视频文件 3.保存视频 总结 一.图像入门 1. ...

  6. OpenCV图像处理——opencv简介(一)

    OpenCV图像处理 文章目录 OpenCV图像处理 前言 一.OpenCV是什么? 二.OpenCV-python开发 三.开发环境 总结 前言 酷爱图像处理,但是并没有系统的学习过opencv,只 ...

  7. Java服务器部署基于OpenCV的C++图像处理项目(三)图片上传并返回处理图

    Java服务器部署基于OpenCV的C++图像处理项目(三)图片上传并返回处理图 1.上传图片并返回灰度图功能 由于使用的springboot开发,直接写一个upload接口供图片上传,以下是spri ...

  8. python怎么打印图片_Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头...

    一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的python科学计算库 ...

  9. java opencv 图片处理_Java图像处理:基于OpenCV与JVM

    Java图像处理:基于OpenCV与JVM 作者:(法)尼古拉斯·莫德奇克(Nicolas Modrzyk) 著 出版日期:2019年04月 文件大小:7.64M 支持设备: ¥60.00仅供试读 适 ...

最新文章

  1. 2020年信号与系统课程批改工作处理程序
  2. python 大数据学习 遇到的问题,及解决方法。
  3. nRF52832的UICR
  4. SAP CRM BSP component在test mode下launch的执行顺序
  5. 【转】sharepoint foundation 2013升级sp1补丁后无法使用搜索功能
  6. MySQL批量update数据(更新的数据值不同)
  7. 编译OSG的FreeType插件时注意的问题
  8. Supported Data Types(flink支持的数据类型)
  9. mysql not in优化_98%的人不知道的MySQL优化器原理
  10. 【已解决】ModuleNotFoundError: No module named ‘web’的解决办法:
  11. php随机数怎么获取?一个简单的函数就能生成
  12. 【实验】【视图】使用v$bgprocess视图获得所有后台进程信息
  13. 将个人文件夹挂载到服务器上,通过 WebDAV 将服务器全部或某个文件夹挂载到电脑上当网络硬盘 | 很文博客...
  14. .Net Web微信H5鱼虾蟹网站开发搭建技术栈
  15. 一文搞懂 Redis
  16. 短视频去水印微信小程序,免费去除视频水印
  17. Unity Shader 皮肤水滴效果
  18. 快应用联盟展示入口合集(11月更新)
  19. 随机权重的PSO算法
  20. 即将迎接我们的 3D 音频以及全新的虚拟现实(下)

热门文章

  1. word中如何设置奇偶页不同的页眉和页脚,怎么从指定页开始加页码
  2. POI生成word文档,包括标题,段落,表格,统计图(非图片格式)
  3. 去除Opera与迅雷的关联
  4. c语言飞机票实验报告格式,c语言航班信息查询系统实验报告
  5. Navicat的安装及免费使用方式
  6. DevOps团队绩效考核重点
  7. 【黑马】Java基础从入门到起飞目录合集
  8. Linux系统网速测速,Linux系统下的网络带宽测速
  9. 百度-视觉技术部招聘计算机视觉相关算法实习生
  10. 学校人事管理系统python实现