G r a y = R ∗ 0.3 + G ∗ 0.59 + B ∗ 0.11 Gray = R * 0.3 + G * 0.59 + B * 0.11 Gray=R∗0.3+G∗0.59+B∗0.11
BMG > JPG > GIF > PNG
直方图:作为一种简单有效的基于统计特性的特征描述子,在计算机视觉领域广泛使用。它的优点主要体现在两个方面:一是对于任意一个图像区域,直方图特征的提取简单方便;其二,直方图表征图像区域的统计特性,可以有效表示多模态的特征分布,并且本身具备一定的旋转不变性。因此,在计算机视觉领域,基于不同底层特征的各种新颖直方图描述子层出不穷,包括亮度直方图,颜色直方图,HOG,局部二值模式直方图[等。其中颜色直方图是目标跟踪领域最为广泛使用的描述子,然而传统的颜色直方图对光照变化敏感,同时目标区域内像素位置分布被完全忽略。
参考博客
对图像进行非线性拉伸
import cv2
import matplotlib.pyplot as plt
src = cv2.imread("./test.png")
src = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
dst = cv2.equalizeHist(src) # 直方图均值化
fig = plt.figure(figsize=(15, 10))
ax1 = fig.add_subplot(221)
plt.imshow(src, "gray")
plt.xticks([]), plt.yticks([]), plt.title("original")
ax2 = fig.add_subplot(222)
ax2.hist(src.ravel(), 32, [0, 255], color="r")
plt.xticks([0, 255]), plt.title("original_histogram")
ax3 = fig.add_subplot(223)
plt.imshow(dst, "gray")
plt.xticks([]), plt.yticks([]), plt.title("equalize_result")
ax4 = fig.add_subplot(224)
ax4.hist(dst.ravel(), 32, [0, 255], color="g")
plt.xticks([0, 255]), plt.title("equalize_histogram")
plt.show()
对于有明显亮的或者暗的区域,则此经典算法有限
原理
AHE算法通过对局部区域的直方图均衡解决上述问题。最简单的形式就是每个像素通过对其周边一个矩形范围内像素的直方图进行均衡化,均衡的方式使用普通的均衡化算法,变换函数同像素周边的累积分布函数(CDF)成比例。当然局部直方图还可以采取其他方式,局部直方图处理大致有3种实现方法:
1)将原始图片划分成不重叠的子块,在每个子块内做直方图处理,该方法简单但输出图像会有块效应;
2)类似模板卷积的方式,以待处理的点为中心,取其邻域为子块,在子块内做直方图处理,处理结果仅映射到该点可以消除块效应,但需要对每个点计算一次直方图处理,效率低;
3)前两种方法的结合版,不再逐像素移动,步长小于子块宽度以确保两个相邻子块有重叠;每个子块做直方图映射后的结果赋值给子块内所有点,这样每个点会有多次赋值,最终的取值为这些赋值的均值;
不够连续,过度放大均匀区的噪声,并且背景变色。。。
彩色的转化为hsv图片用其v明度进行均衡
img = cv2.imread('test02.png',1)
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
channels = cv2.split(hsv)
#createCLAHE:将图片分成很多小块,对每一小块进行直接直方图均衡化。
#clipLmit : 大于该参数的部分将被剪裁掉平均分配给整个图像
#tileGridSize : 表示每次处理块的大小。
#一般的clipLimit设置的值是40,值越大,均化的效果越好,值越接近0,就和原图像没什么区别
clahe = cv2.createCLAHE(clipLimit=4.0, tileGridSize=(8, 8))
clahe.apply(channels[2], channels[2])
hsv = cv2.merge(channels)
img2 = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB)
plt.subplot(121),plt.imshow(img)
plt.subplot(122),plt.imshow(img2)
形态学转换
一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀。他们的变体构成了开运算,闭运算,梯度等。
腐蚀
卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是 1,那么中心元素就保持原来的像素值,否则就变为零。
去除白噪声很有用,也可以用来断开两个连在一块的物体。
cv2.erode(img,kernel,iterations = 1)
膨胀
卷积核对应的原图像的像素值中只要有一个是 1,中心元素的像素值就是 1。所以这个操作会增加图像中的白色区域(前景)。一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变小。所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。膨胀也可以用来连接两个分开的物体。
dilation = cv2.dilate(img,kernel,iterations = 1)
开运算
先进性腐蚀再进行膨胀就叫做开运算。被用来去除噪声。这里我们用到的函数是cv2.morphologyEx()。
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
闭运算
先膨胀再腐蚀。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
形态学梯度
膨胀与腐蚀的区别。
closing = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
礼帽,黑帽
原图与开闭运算的图像差。
结构化元素
OpenCV函数 cv2.getStructuringElement()。你只需要告诉他你需要的核的形状和大小
示例代码
# 形态学
import numpy as np
img=cv2.imread('test02.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel=np.ones([2,2],int)
t_img=cv2.erode(img,kernel,iterations=1)
t_img1=cv2.dilate(img,kernel,iterations=1)
t_img2=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
plt.subplot(221),plt.imshow(t_img, 'gray')
plt.subplot(222),plt.imshow(t_img1, 'gray')
plt.subplot(223),plt.imshow(t_img2, 'gray')
plt.subplot(224),plt.imshow(img, 'gray')
前面我们提到,当用均值滤波器降低图像噪声的时候,会带来图像模糊的副作用。我们当然希望看到的是清晰图像。那么,清晰图像和模糊图像之间的差别在哪里呢?从逻辑上考虑,图像模糊是因为图像中物体的轮廓不明显,轮廓边缘灰度变化不强烈,层次感不强造成的,那么反过来考虑,轮廓边缘灰度变化明显些,层次感强些是不是图像就更清晰些呢。
那么,这种灰度变化明显不明显怎样去定义呢。我们学过微积分,知道微分就是求函数的变化率,即导数(梯度),那么对于图像来说,可不可以用微分来表示图像灰度的变化率呢,当然是可以的,前面我们提到过,图像就是函数嘛。
———————————————— 版权声明:本文为CSDN博主「saltriver」的原创文章,遵循 CC 4.0 BY-SA
版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/saltriver/article/details/78987096
不提倡,本身存在缺陷 ,既没有很好的去除噪声点,也破环了图像原有的细节
有效去除椒盐噪声
模拟人眼,关注中心区域
有效去除高斯噪声
其具有分解特性(级联高斯)2D卷积拆分为两个相同的1D卷积
img=cv2.imread('test02.png',0)
#用2D卷积核作模糊图像处理
filter=np.ones([5,5],float)/25
m_img=cv2.filter2D(img,-1,filter)
#平均
m_img=cv2.blur(img,(20,20))
#高斯模糊
m_img=cv2.GaussianBlur(img,(5,5),0)
#双边滤波
#9邻域直径,两个75分别是空间高斯函数标准差,灰度值相似性高斯函数标准差
m_img=cv2.bilateralFilter(img,9,75,75)
wid=cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.imshow('img',m_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
理解频域图
'''
图像金字塔
'''
lower_reso=cv2.pyrDown(img)
lower_reso2=cv2.pyrDown(lower_reso)
lower_reso3=cv2.pyrDown(lower_reso2)
cv2.imshow('img4',lower_reso3)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里写的很粗糙(因为没有太看懂T T)
其关键不足在于:对于非平稳信号的局限性
跟STFT的思路接近,但小波变换直接把傅里叶变换的基给换了——将无限长的三角函数基换成了有限长的会衰减的小波基。
基于傅里叶变换的滤波:低通滤波、相位滤波、频段滤波