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

图像平滑

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

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 图片换背景色内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • opencv转换颜色空间更改图片背景

    本文实例为大家分享了opencv转换颜色空间更改图片背景的具体代码,供大家参考,具体内容如下 思路: 1.将BGR转换为HSV颜色空间 2.设置掩模 3.位运算 这里以更改摩托罗拉logo背景为例,图片在必应图片搜索得知,具体代码如下: import numpy as np import cv2 from imageio import imread import matplotlib.pyplot as plt def show(img,winname = "img"): cv2.na

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

    图像平滑 模糊/平滑图片来消除图片噪声 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 # 卷积操作,

  • Python 利用OpenCV给照片换底色的示例代码

    OpenCV的全称是:Open Source Computer Vision Library.OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法.相比于PIL库来说OpenCV更加强大, 可以做更多更复杂的应用,比如人脸识别等. 1. 读入并显示图片 im

  • OpenCV 表盘指针自动读数的示例代码

    前段时间参加了一个表盘指针读数的比赛,今天来总结一下 数据集一共有一千张图片: 方法一:径向灰度求和 基本原理: 将图像以表盘圆心转换成极坐标,然后通过矩阵按行求和找到二值图最大值即为指针尖端 导入需要用到的包 import cv2 as cv import numpy as np import math from matplotlib import pyplot as plt import os 图像预处理 去除背景:利用提取红色实现 def extract_red(image): "&quo

  • python使用OpenCV模块实现图像的融合示例代码

    可以通过OpenCV函数cv.add()或简单地通过numpy操作添加两个图像,res = img1 + img2.两个图像应该具有相同的深度和类型,或者第二个图像可以是标量值. 三种融合 注意融合时,一般来说两个图像的尺寸是一样大小的,如果大小不一样,需要把大的图像的某一部分先截出来,与小的图先融合,再作为整体替换掉原来大图中抠出的小图部分. """ # @Time : 2020/4/3 # @Author : JMChen """ impor

  • Python Opencv实现单目标检测的示例代码

    一 简介 目标检测即为在图像中找到自己感兴趣的部分,将其分割出来进行下一步操作,可避免背景的干扰.以下介绍几种基于opencv的单目标检测算法,算法总体思想先尽量将目标区域的像素值全置为1,背景区域全置为0,然后通过其它方法找到目标的外接矩形并分割,在此选择一张前景和背景相差较大的图片作为示例. 环境:python3.7 opencv4.4.0 二 背景前景分离 1 灰度+二值+形态学 轮廓特征和联通组件 根据图像前景和背景的差异进行二值化,例如有明显颜色差异的转换到HSV色彩空间进行分割. 1

  • Vue项目实现html5图片上传的示例代码

    目录 图例 1.选择图片 2.预览图片 2.1添加图片预览代码 两种方法的对比 3.裁剪图片 4.上传 选择图片 -> 预览图片 -> 裁剪图片 -> 上传图片 我会以事例贯穿图片接下来,就详细的介绍每个步骤具体实现. 图例 1.选择图片 选择图片有什么好讲的呢?不就一个 input[type=file] ,然后点击就可以了吗?确实是这样的,但是,我们想要做得更加的友好一些,比如需要过滤掉非图片文件, 或只允许从摄像头拍照获取图片等,还是需要进行一些简单配置的. 下面就先来看看最简单的选

  • OpenCV 图像分割实现Kmean聚类的示例代码

    目录 1 Kmean图像分割 2 流程 3 实现 1 Kmean图像分割 按照Kmean原理,对图像像素进行聚类.优点:此方法原理简单,效果显著.缺点:实践发现对于前景和背景颜色相近或者颜色区分度差的图像效果不显著.本文对图像进行滤波,主要是为了消除树枝颜色的影响(滤波为非Keman图像分割的必要操作). 2 流程 (1)读入图片,把图片转化为二维.(2)根据Kmean算法对图像分割,返回类别标签和各类别中心点.(3)根据类别标签复制各类别中心点得到结果,在对结果调整到原有尺度. 3 实现 (1

  • OpenCV+Qt实现图像处理操作工具的示例代码

    目录 一.目标 二.使用Qt界面 三.图像处理操作完整代码 一.目标 Qt界面实现 雪花屏 高斯模糊 中值滤波 毛玻璃 灰度化 XY方向模糊 双边模糊 腐蚀 [图像处理操作] 要求左边原图,右边效果图 结果展示如下:[图像处理实现有点多,就不一个一个地展示了,各别展示如下] 雪花屏 毛玻璃 灰度化处理 二.使用Qt界面 使用到Qt中的UI设计界面 设计好界面之后最好先保存 对每一个按钮设计槽函数 三.图像处理操作完整代码 难点在于:Qt是QImage而OpenCV是Mat,需要Mat转QImag

  • Android 给图片加上水印的示例代码(支持logo+文字)

    本文介绍了Android 给图片加上水印的示例代码(支持logo+文字),分享给大家,具体如下: 现在我们想要往图片上打上水印,该水印应符合这样的需求的: 支持logo+文字: 文字信息支持多行展示: 用户可以选择水印在图片上的生成位置(左上.右上.右下和左下). 粗略的结构图低配版大概就长这样... 水印结构图.png 现在提供这样的一种思路去实现这一个需求,我们可以通过自定义一个view,view的布局中包含logo.公司名称和相关信息,这个view就是我们要打上图片的水印. 这样的一个vi

  • React Native使用fetch实现图片上传的示例代码

    本文介绍了React Native使用fetch实现图片上传的示例代码,分享给大家,具体如下: 普通网络请求参数是JSON对象 图片上传的请求参数使用的是formData对象 使用fetch上传图片代码封装如下: let common_url = 'http://192.168.1.1:8080/'; //服务器地址 let token = ''; //用户登陆后返回的token /** * 使用fetch实现图片上传 * @param {string} url 接口地址 * @param {J

随机推荐