大家好,关于深入解析:OpenCV中的多样化卷积核滤波器应用很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
if len(img.shape)==3:
H、W、C=img.shape
否则:
img=np.expand_dims(img, 轴=-1)
H、W、C=img.shape
打印(高、宽、厚)
## 零填充
pad=K_size //2 这里是为后续构建一个包裹整个图像的表面做准备。注意前面灰色的//2不是注释。这就是python3的真除法的写法,也就是取商。
out=np.zeros((H + pad * 2, W + pad * 2, C), dtype=np.float)//out将整个img包裹起来,外面有一半的k_size层
打印出)
out[pad: pad + H, pad: pad + W]=img.copy().astype(np.float)//out内层与img一模一样,外层为0
打印出)
## 准备内核
K=np.zeros((K_size, K_size), dtype=np.float)//构造卷积核
对于范围内的x (-pad, -pad + K_size):
对于范围内的y(-pad, -pad + K_size):
K[y + pad, x + pad]=np.exp(-(x ** 2 + y ** 2)/(2 * (sigma ** 2)))
K /=(2 * np.pi * 西格玛* 西格玛)
K /=K.sum()//卷积核归一化
tmp=out.copy()
# 过滤
对于范围(H): 内的y
对于范围(W): 内的x
对于范围(C): 中的c
out[pad + y, pad + x, c]=np.sum(K * tmp[y: y + K_size, x: x + K_size, c])//核心操作,重新计算对应位置的加权像素值out 和img
输出=np.clip(输出, 0, 255)
out=out[pad: pad + H, pad: pad + W].astype(np.uint8)//去掉out外层的0
返回
中值滤波
该滤波器采用滤波器范围内像素的中值进行滤波,效果比高斯滤波器还要显着。按值运算的代价极其昂贵//这里的代码对应的是上面的高斯卷积核
def Median_filter(img, K_size=3):
H、W、C=img.shape
## 零填充
pad=K_size //2 注意前面灰色的//2不是注释。这是python3中真除法的写法,即取商。
out=np.zeros((H + pad*2, W + pad*2, C), dtype=np.float)//同样生成长宽比img大K_size的黑色图像
out[pad:pad+H, pad:pad+W]=img.copy().astype(np.float)//同样是out和img对应的填充值。
tmp=out.copy()
# 过滤
对于范围(H): 内的y
对于范围(W): 内的x
对于范围(C): 中的c
out[pad+y, pad+x, c]=np.median(tmp[y:y+K_size, x:x+K_size, c])//取中值来填充,也就是说没有加权的概念
out=out[pad:pad+H, pad:pad+W].astype(np.uint8)//同样捕获原始大小
返回
均值滤波
与中值滤波器基本相同defmean_filter(img, K_size=3):
H、W、C=img.shape
# 零填充
pad=K_size //2 注意前面灰色的//2不是注释。这是python3中真除法的写法,即取商。
out=np.zeros((H + pad * 2, W + pad * 2, C), dtype=np.float)
out[pad: pad + H, pad: pad + W]=img.copy().astype(np.float)
tmp=out.copy()
# 过滤
对于范围(H): 内的y
对于范围(W): 内的x
对于范围(C): 中的c
out[pad + y, pad + x, c]=np.mean(tmp[y: y + K_size, x: x + K_size, c])//这里只是和中值滤波有一点小小的区别
out=out[pad: pad + H, pad: pad + W].astype(np.uint8)
返回
Motion Filter 对角线滤波
与高斯滤波器不同,高斯滤波器的形状为[[1,2,1],[2,4,2],[1,2,1]],而运动滤波器的形状为[[0 ,0,1/3],[0,1/3,0],[1/3,0,0]] 对角线上的像素权重def Motion_filter(img, K_size=3):
H、W、C=img.shape
# Kernel,构造卷积核
K=np.diag( [1] * K_size ).astype(np.float)
K /=K_大小
# 零填充
pad=K_size //2 注意前面灰色的//2不是注释。这是python3中真除法的写法,即取商。
out=np.zeros((H + pad * 2, W + pad * 2, C), dtype=np.float)
out[pad: pad + H, pad: pad + W]=img.copy().astype(np.float)
tmp=out.copy()
# 过滤
对于范围(H): 内的y
对于范围(W): 内的x
对于范围(C): 中的c
out[pad + y, pad + x, c]=np.sum(K * tmp[y: y + K_size, x: x + K_size, c])
out=out[pad: pad + H, pad: pad + W].astype(np.uint8)
返回
MAX-MIN滤波器
使用网格中像素的最大值和最小值之间的差值重新分配网格中的像素。通常用于边缘检测。边缘检测用于检测图像中的线条。像这样从图像中提取信息的操作称为特征提取。边缘检测通常对灰度图像进行。 def max_min_filter(img, K_size=3):
H, W=图像形状
#零填充
pad=K_size //2 注意前面灰色的//2不是注释。这是python3中真除法的写法,即取商。
out=np.zeros((H + pad * 2, W + pad * 2), dtype=np.float)
out[pad: pad + H, pad: pad + W]=grey.copy().astype(np.float)
tmp=out.copy()
# 过滤
对于范围(H): 内的y
对于范围(W): 内的x
out[pad + y, pad + x]=np.max(tmp[y: y + K_size, x: x + K_size]) -
np.min(tmp[y: y + K_size, x: x + K_size])
out=out[pad: pad + H, pad: pad + W].astype(np.uint8)
返回
差分滤波器
差分滤波器具有提取图像亮度急剧变化的边缘的作用,可以得到相邻像素的差分纵向值K=[[0, -1, 0], [0, 1, 0 ]、[0, 0, 0]],可用于检测垂直分割线。横向K=[[0, 0, 0], [-1, 1, 0], [0, 0, 0]],可用于检测水平分割线。 def different_filter(img, K_size=3):
H、W、C=img.shape
#零填充
pad=K_size //2 注意前面灰色的//2不是注释。这是python3中真除法的写法,即取商。
out=np.zeros((H + pad * 2, W + pad * 2), dtype=np.float)
out[pad: pad + H, pad: pad + W]=grey.copy().astype(np.float)
tmp=out.copy()
out_v=out.copy()
out_h=out.copy()
# 垂直内核
Kv=[[0. -1. 0.],[0. 1. 0.],[0. 0. 0.]]
#水平内核
Kh=[[0. 0. 0.],[-1. 1. 0.], [0. 0. 0.]]
# 过滤
对于范围(H): 内的y
对于范围(W): 内的x
out_v[pad + y, pad + x]=np.sum(Kv * (tmp[y: y + K_size, x: x + K_size]))
out_h[pad + y, pad + x]=np.sum(Kh * (tmp[y: y + K_size, x: x + K_size]))
out_v=np.clip(out_v, 0, 255)
out_h=np.clip(out_h, 0, 255)
out_v=out_v[pad: pad + H, pad: pad + W].astype(np.uint8)
out_h=out_h[pad: 焊盘+ H, pad: 焊盘+ W].astype(np.uint8)
return out_v, out_h
Sobel滤波器
Sobel滤波器可以提取特定方向(纵向或横向)的边缘,类似于上面提到的差分滤波器纵向K=[[1, 2, 1], [0, 0, 0] ,[ -1, -2, -1]],可用于检测垂直分割线和横向K=[[1, 0, -1], [2, 0, -2], [1, 0, -1]], 可用于检测水平分割线def sobel_filter(img, K_size=3):
if len(img.shape)==3:
H、W、C=img.shape
否则:
img=np.expand_dims(img, 轴=-1)
H、W、C=img.shape
#零填充
pad=K_size //2 注意前面灰色的//2不是注释。这是python3中真除法的写法,即取商。
out=np.zeros((H + pad * 2, W + pad * 2), dtype=np.float)
out[pad: pad + H, pad: pad + W]=grey.copy().astype(np.float)
tmp=out.copy()
out_v=out.copy()
out_h=out.copy()
## 索贝尔垂直
Kv=[[1. 2. 1.],[0. 0. 0.], [-1. -2. -1.]]
## 索贝尔水平
Kh=[[1. 0. -1.],[2. 0. -2.],[1. 0. -1.]]
# 过滤
对于范围(H): 内的y
对于范围(W): 内的x
out_v[pad + y, pad + x]=np.sum(Kv * (tmp[y: y + K_size, x: x + K_size]))
out_h[pad + y, pad + x]=np.sum(Kh * (tmp[y: y + K_size, x: x + K_size]))
out_v=np.clip(out_v, 0, 255)
out_h=np.clip(out_h, 0, 255)
out_v=out_v[pad: pad + H, pad: pad + W].astype(np.uint8)
out_h=out_h[pad: 焊盘+ H, pad: 焊盘+ W].astype(np.uint8)
return out_v, out_h
Prewitt滤波器
与上述微分滤波器和Sobel滤波器一样,Prewitt滤波器也是一种用于边缘检测的滤波器。纵向K=[[-1, -1, -1], [0, 0 , 0], [1, 2, 1]],可用于检测纵向分割线,横向K=[[-1 , 0, 1], [-1, 0, 1], [-1, 0, 1] ],可用于检测水平分割线def prewitt_filter(img, K_size=3):
if len(img.shape)==3:
H、W、C=img.shape
否则:
img=np.expand_dims(img, 轴=-1)
H、W、C=img.shape
#零填充
pad=K_size //2 注意前面灰色的//2不是注释。这是python3中真除法的写法,即取商。
out=np.zeros((H + pad * 2, W + pad * 2), dtype=np.float)
out[pad: pad + H, pad: pad + W]=grey.copy().astype(np.float)
tmp=out.copy()
out_v=out.copy()
out_h=out.copy()
## 普威特垂直内核
Kv=[[-1. -1. -1.],[0. 0. 0.], [1. 1. 1.]]
## prewitt 水平内核
Kh=[[-1. 0. 1.],[-1. 0. 1.],[-1. 0. 1.]]
# 过滤
对于范围(H): 内的y
对于范围(W): 内的x
out_v[pad + y, pad + x]=np.sum(Kv * (tmp[y: y + K_size, x: x + K_size]))
out_h[pad + y, pad + x]=np.sum(Kh * (tmp[y: y + K_size, x: x + K_size]))
out_v=np.clip(out_v, 0, 255)
out_h=np.clip(out_h, 0, 255)
out_v=out_v[pad: pad + H, pad: pad + W].astype(np.uint8)
out_h=out_h[pad: 焊盘+ H, pad: 焊盘+ W].astype(np.uint8)
return out_v, out_h
Laplacian滤波器
拉普拉斯滤波器是对图像亮度进行两次微分来检测边缘的滤波器Ix(x,y)=[I(x+1,y)I(x,y)]/[ (x +1)x]=I(x+1,y)I(x,y) 类似地Iy(x,y)=[I(x,y+1)I(x,y)] /[( y+1)y]=I(x,y+1)I(x,y) 同理可得Ixx(x,y)=[Ix(x,y)Ix(x-1 ,y) )]/[(x(x-1)]=Ix(x,y)Ix(x-1,y)=I(x+1,y)I(x,y)-(I(x ,y)I(x-1,y))=I(x+1,y)-2I(x,y)+I(x-1,y) 同理,Ixx(x,y)可以可得=I(x,y+1)-2I(x,y)+I(x,y-1) 因此拉普拉斯表达式为Ixx(x,y)+Iyy(x,y)=I(x + 1,y)-2I(x,y)+I(x-1,y)+I(x,y+1)-2I(x,y)+I(x,y-1)=I(x + 1,y)+I(x-1,y)+I(x,y+1)-4I(x,y)+I(x,y-1) 因此,拉普拉斯卷积核为K=[[0 , 1, 0], [1, -4, 1], [0, 1, 0] ]def laplacian_filter(img, K_size=3):
H、W、C=img.shape
# 零填充
pad=K_size //2 注意前面灰色的//2不是注释。这是python3中真除法的写法,即取商。
out=np.zeros((H + pad * 2, W + pad * 2), dtype=np.float)
out[pad: pad + H, pad: pad + W]=grey.copy().astype(np.float)
tmp=out.copy()
#laplaciankernle
K=[[0. 1. 0.],[1. -4. 1.], [0. 1. 0.]]
# 过滤
对于范围(H): 内的y
对于范围(W): 内的x
out[pad + y, pad + x]=np.sum(K * (tmp[y: y + K_size, x: x + K_size]))
输出=np.clip(输出, 0, 255)
out=out[pad: pad + H, pad: pad + W].astype(np.uint8)
返回
Emboss滤波器
浮雕滤镜可以使物体轮廓更清晰def emboss_filter(img, K_size=3):
H、W、C=img.shape
# 零填充
pad=K_size //2 注意前面灰色的//2不是注释。这是python3中真除法的写法,即取商。
out=np.zeros((H + pad * 2, W + pad * 2), dtype=np.float)
out[pad: pad + H, pad: pad + W]=grey.copy().astype(np.float)
tmp=out.copy()
# 浮雕内核
K=[[-2. -1. 0.],[-1. 1. 1.], [0. 1. 2.]]
# 过滤
对于范围(H): 内的y
对于范围(W): 内的x
out[pad + y, pad + x]=np.sum(K * (tmp[y: y + K_size, x: x + K_size]))
输出=np.clip(输出, 0, 255)
out=out[pad: pad + H, pad: pad + W].astype(np.uint8)
返回
LoG滤波器
LoG 是高斯拉普拉斯算子的缩写。使用高斯滤波器对图像进行平滑处理,然后使用拉普拉斯滤波器使图像的轮廓更加清晰。 //对数滤波器公式与高斯滤波器公式类似。它是高斯滤波器和拉普拉斯滤波器的组合。详情请参见代码公式。
def LoG_filter(img, K_size=5, sigma=3):
H、W、C=img.shape
# 零填充
pad=K_size //2 注意前面灰色的//2不是注释。这是python3中真除法的写法,即取商。
out=np.zeros((H + pad * 2, W + pad * 2), dtype=np.float)
out[pad: pad + H, pad: pad + W]=grey.copy().astype(np.float)
tmp=out.copy()
#LoGKernel
K=np.zeros((K_size, K_size), dtype=np.float)
对于范围内的x (-pad, -pad + K_size):
对于范围内的y(-pad, -pad + K_size):
K[y + pad, x + pad]=(x ** 2 + y ** 2 - sigma ** 2) * np.exp( -(x ** 2 + y ** 2)/(2 * (sigma **2)))
K /=(2 * np.pi * (西格玛** 6))
K /=K.sum()
# 过滤
对于范围(H): 内的y
对于范围(W): 内的x
out[pad + y, pad + x]=np.sum(K * tmp[y: y + K_size, x: x + K_size])
输出=np.clip(输出, 0, 255)
out=out[pad: pad + H, pad: pad + W].astype(np.uint8)
【深入解析:OpenCV中的多样化卷积核滤波器应用】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
学了OpenCV还一直在想怎么用卷积核滤波呢!这篇文章刚好帮到我。
有20位网友表示赞同!
我一直对图像处理感兴趣,现在开始学习OpenCV,希望这篇介绍能让我明白卷积核的原理。
有17位网友表示赞同!
之前只知道OpenCV可以做图像识别,原来卷积核的使用也很重要啊!
有5位网友表示赞同!
各种滤波器都有哪些?我得好好看看这篇文章了解一下它们的作用吧。
有17位网友表示赞同!
学习OpenCV需要掌握很多知识点,卷积核这一块估计要花不少时间精力.
有13位网友表示赞同!
看了标题感觉很有意思,我最近开始用OpenCV做项目,这篇文章正好能解决一些我的问题。
有16位网友表示赞同!
终于找到关于卷积核的讲解了!好久都找不到合适的资料看。
有8位网友表示赞同!
这篇文章是不是能详细介绍各个滤波器的效果呢?这样学习起来更容易理解。
有10位网友表示赞同!
我现在用的图像处理工具比较简单,想学习OpenCV来提升效率!
有11位网友表示赞同!
希望能看到一些关于卷积核应用案例的讲解,这样更直观一些。
有17位网友表示赞同!
之前对卷积核一直感觉很抽象,希望这篇文章能用通俗易懂的方式解释。
有20位网友表示赞同!
学习OpenCV的目标是做图像识别,应该要好好理解卷积核的使用方法吧!
有13位网友表示赞同!
终于找到资源来学习这个知识点了!谢谢分享。
有16位网友表示赞同!
不知道哪些滤波器在实际应用中效果最好呢?希望这篇文章能有比较啊!
有19位网友表示赞同!
OpenCV是一个好用的工具,掌握卷积核用法就能解锁很多高级功能了!
有13位网友表示赞同!
我觉得这篇文章标题太棒了,直接点明主题,很吸引人。
有6位网友表示赞同!