精华内容
下载资源
问答
  • python高斯噪声怎么去除_OpenCV 常用总结(Python)
    千次阅读
    2020-11-21 06:51:53

    最近一直在用cv2,记录一下常用的一些操作和代码吧。

    首先放OpenCV 的python官方文档链接:

    Welcome to OpenCV-Python Tutorials’s documentation!

    OpenCV 教程 - OpenCV 2.3.2 documentation

    主要用的模块大概分为以下几类:

    1. 图片读写,2. 图像滤波,3.图像增强,4.阈值分割,5.形态学操作,当然还有其他。。。

    绪论:

    工作环境Linux Ubuntu 16.04, Python 3.6, OpenCV 4.0。因为OpenCV的数据结构是基于numpy的,所以也要对numpy有大概的了解。

    首先导入必要的库:

    import 

    由于Ubuntu下cv2的imshow展示图片功能会有bug,因此使用matplotlib来展示图片。

    一,图片读写:

    Basic

    图片读入:

    image = cv2.imread('test.jpg', -1)

    没什么好说的,第一个参数文件路径,第二个参数是通道数,-1代表原图与原图保持一致,0代表转换为灰度图,1代表使用BGR通道读入。

    需要注意的就是读入的图片是以np.ndarray类型存储的,且彩色图像的通道为BGR与常见的RGB不同。

    图片展示:

    cv2.imshow('image', image)
    cv2.WaitKey(0)
    cv2.destroyAllWindows()

    imshow第一个参数是窗口名,string类。第二个是np.ndarray的数组。注意在下面要使用WaitKey,不然展示窗口就会闪一下,程序就继续运行了,参数代表停多长时间,0的话是除非干扰不然一直展示。

    在Ubuntu下cv2的imshow会出bug, 使程序崩溃,因此使用pyplot展示图片,但需要注意pyplot的彩色图片是RGB的格式,所以展示图像时需要先转换通道。

    对于灰度图像:

    plt.imshow(image, cmap='gray')
    plt.show()

    对于彩色图像:

    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    plt.imshow(image)
    plt.show()

    图片写出:

    cv2.imwrite('image.jpg', image)

    这边需要注意的是第一个参数文件名要加格式,比如.jpg .png 之类的。

    More

    多的话只对文件读入加一些。

    读取某个文件夹下所有jpg或其他图片可以使用glob,但无法读取子文件夹下的。

    import glob
    PATH = ''
    for file in glob.glob(PATH + '*.jpg'):
        img = cv2.imread(file, -1)

    也可以把jpg改为png等等。

    那么如何读取一个文件夹内包括其子文件夹下的所有图片呢?这个时候要用os和fnmatch了。

    import os
    import fnmatch
    
    
    def find_files(directory, pattern):
        """
        Method to find target files in one directory, including subdirectory
        :param directory: path
        :param pattern: filter pattern
        :return: target file path
        """
        for root, dirs, files in os.walk(directory):
            for basename in files:
                if fnmatch.fnmatch(basename, pattern):
                    filename = os.path.join(root, basename)
                    yield filename
    
    for filename in find_files('Home/Leon', '*.jpg'):
        img = cv2.imread(filename, -1)

    这个看一下应该就知道怎么回事了把?find_files引用了一个网上的代码我忘了哪个了,,,

    然后对读入的图片色彩空间转换,常用cvtColor

    img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    第二个参数很多种,常用的色彩空间也就是把BGR转成RGB或者Gray,偶尔会用HSV,因为HSV不会有很多颜色的参数,对于图片的纹理啊这些特征的提取和处理很有用。HSV三个通道分别是:色调(H),饱和度(S),明度(V)。具体释义可以看维基百科的

    https://zh.wikipedia.org/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4

    实话讲对HSV我理解的不多,反正就是H跟颜色有关,是一种对于RGB的非线性变换,饱和度的话就是我们有时候会说有些颜色好艳啊之类的,我会用来提取纹理,V明度我一直就认为是类似灰度值了。印象中有专门的矩阵来乘可以完成两个色彩空间的变换。

    二,图像滤波

    图像降噪:

    降噪第一步是估计噪声,只有知道是什么样子的噪声类型才可以找到好的降噪方法。估计噪声的话一般先观察直方图,也就是Histogram。一般有两种方法,一种是opencv自带的,还有一个matplotlib的,我个人倾向第二种,因为简单。

    plt.hist(img.ravel(), 256, [0, 256])
    plt.show()

    对于如何估计噪声不说了,主要是写应用的。

    # 6.2 补充

    上面只是看直方图的,但在程序中如果想使用直方图的信息怎么办呢?建议还是使用cv2自带的方法,这个速度很快。(我自己写的计算直方图方法速度的10倍,也可能是因为我自己写的太辣鸡了)

    代码如下所示:

    hist = cv2.calcHist([img], [0], None, [256], [0, 256])

    返回的是一个length=256的列表,分别是像素值为0--255的统计个数。

    # 补充完毕

    对于降噪常用的方法有均值滤波,高斯滤波,中值滤波,双边滤波等,当然你也可以定义自己的滤波函数。

    blur = cv2.blur(img,(5,5))
    gau_blur = cv2.GaussianBlur(img,(5,5),0)
    median = cv2.medianBlur(img,5)
    bi_blur = cv2.bilateralFilter(img,9,75,75)

    从上到下分别是均值滤波,高斯滤波,中值滤波,双边滤波。下面说一下应用场景:

    1. 均值滤波我反正不怎么用,了解滤波概念学习下就好了。
    2. 高斯滤波一般都会有一些效果,当我实在找不到最好的滤波方法时我一般使用高斯滤波,不保证效果但不会出问题。主要滤高斯噪声的,就是直方图看着正态分布那样。但现实图片中并没有高斯噪声,高斯只是比较适合去拟合现实中的一些噪声。(不确定欢迎指正)
    3. 均值滤波我用的比较多,对于椒盐噪声有很好的效果,就是直方图上会有一些孤立的高点那样的。当然滤出椒盐噪声的话维纳滤波也会有很好效果,但较为麻烦所以不怎么用。
    4. 双边滤波相当于把大图片分小再一块一块滤波,很多时候效果也不错,网上看说美颜会经常用。他比较好的一点是可以保留原始图像的纹理边缘等细节。

    对于函数具体参数可以参看

    Smoothing Images

    除此之外还有局部均值滤波等,non-local-means,我个人感觉和bilateralFilter比较相似,用于一张大图上有一些相似部分的滤波,速度很慢而且占用内存也挺大,不建议用。

    Image Denoising - OpenCV-Python Tutorials 1 documentation

    边缘检测:

    实际应用中我用的比较多的是找边界,findContours。

    contours, _ = cv2.findContours(img_close, 1, 2)

    其中contours保存了图像中所有的contour信息,是一个列表。

    这里注意下opencv版本更新,老版finContours是返回三个参数,现在是两个参数。还有Contour都是闭合的。但很多时候Contour会有大有小,我们可以设置阈值来滤出一些我们不想要的边界,最常用的是根据包围的面积大小来看,偶尔也会根据周长。在滤出contour后经常会话bounding box, 因为Contour通常是不规则的。

    for contour in contours:
        if area_thresh_max > cv2.contourArea(contour) > area_thresh_min:
            x, y, w, h = cv2.boundingRect(contour)
            cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 10)

    boundingRect返回的分别是Contour左上角坐标x,y和矩形框的宽高w,h。

    另外对于Contour还可以根据其area或len排个序,取前几位这样。

    contours = sorted(contours, key=cv2.contourArea, reverse=True)[:1]

    此外边缘检测还经常用一些算子,Canny, Sobel, Laplacian等。其中Canny对边缘检测效果最好,但是很多时候也会受到噪音的干扰。Laplacian经常用来做边缘增强。

    我建议大家可以根据实际情况自己定义kernel算子,然后使用filter2D来做。

    比如求上下的边缘就可以定义:

    KERNEL_HORIZON = np.asarray([[1, 2, 1],
                                [0, 0, 0],
                                [-1, -2, -1]], dtype=np.int)

    然后使用:

    img = cv2.filter2D(img, -1, KERNEL_HORIZON)

    左右边缘的话可以:

    KERNEL_VERTICAL = np.asarray([[1, 0, -1],
                                 [2, 0, -2],
                                 [1, 0, -1]], dtype=np.int)

    反正算子随便定,你3X3,5X5,数值也随意,反正多试试哪个好用哪个。

    不过需要注意一点是矫正,你比如我的KERNEL_HORIZON就有可能让边缘向上或向下偏一个像素值,虽然很小,但如果是做cutting的话就不是那么精确了。

    还有线检测圆检测等,使用Hough方法,该方法原理比较简单,很容易懂,建议大家看看原理。但在Hough前要先将图像二值化,即非黑即白。好像是后面我要说的,可以跳着看。

    edges = cv2.Canny(gray_img,50,150,apertureSize = 3)
    lines = cv2.HoughLines(edges,1,np.pi/180,200)
    
    cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
    circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                                param1=50,param2=30,minRadius=0,maxRadius=0)

    在实际应用中碰到的问题往往与纯粹的直线会有些偏差,所以我一般会自己仿照着Hough的原理写一下针对性的函数。所以还是看看原理吧兄弟们。

    三,图像增强

    图像增强,其实也就是对比度增强,还是先看一眼直方图然后决定怎么增强吧。最简单的无外乎线性变换,比如你原图的直方图灰度分布0-128就到顶了,那就可以img = img*2,对比度就增强了两倍。这也是全局化的增强,叫直方图均衡化(Histogram Equalization)。

    OpenCV里有直接的函数

    img_equ = cv2.equalizeHist(img)

    还有局部自适应直方图均衡化,叫CLAHE(Contrast Limited Adaptive Histogram Equalization),这也是我用的比较多的。

    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    img = clahe.apply(img)

    第一个参数是对比度的limited,第二个参数是局部的窗口大小。官方文档也写得很清晰了:

    Histograms - 2: Histogram Equalization

    增强这一部分其实很多类,上面说的都是对比度的增强,当然还有边缘增强,就是锐化,这种一般先使用边缘检测提取出边缘的特征图,再拿边缘特征图与原图相加就可以是边缘部分得到增强。常用的是高斯边缘检测。

    四,阈值分割

    阈值分割其实也就是二值化,首先我觉得大家都知道现在几乎所有图片都是256个灰度级吧,二值化就是变成非黑即白,就是只有两个灰度级。

    最简单的阈值分割就是,比如127这个灰度吧,你让大于127的变成255,小于等于127的变成0就好了,这个可以直接用numpy的数据结构操作的,不需要用什么OpenCV的函数,反正建议大家尽量不要过于依赖OpenCV已有的函数,要活学活用是吧。

    img[img > 127] = 255
    img[img < 128] = 0

    可以看出numpy是很方便的,需要说明下这里最好不要用两个for循环来遍历图片,比大小,然后赋值0或255,这样速度太慢了。numpy里是矩阵运算的,速度会快很多。

    上面这个其实就是OpenCV里的THRESH_BINARY,里面还有inverse就是黑白换一下,这玩意直接拿255减原图不就妥了嘛,反正简单的二值化建议直接用numpy做。

    OpenCV里还有Adaptive Threshold,有两个参数分别是mean和gaussian,反正我理解的就是,先做个均值滤波或者高斯滤波完了再简单的Threshold,所以我也不怎么用。不过还是放一下文档链接吧,随缘看。

    Image Thresholding

    OK,上面的都不怎么用那我阈值分割平常用什么啊?我觉得利器就是OTSU,这种阈值分割是自适应的阈值,会根据Histogram计算出最小方差差的灰度值,然后用那个灰度值来做简单的阈值分割。这种对于直方图有个波浪起伏那种特别好用,就是下面第三个。因为很多时候我们很难去确定到底用哪个阈值,比如上面说127是随意说的,对不同图片就阈值不一样。

    a560616c985dca2c3510778ef4998e21.png

    也不一定是完全要求这样非常明显的分布啦,比如第二个的直方图,只要后半部分有那么一点点上升的趋势,就可以很好的分出来了。用起来也很好用:

    ret,th = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

    ret我记得是算出来的那个阈值,th就是ndarray的图片了,一般我只关心图片,所以就直接

    _, th = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

    就很舒服。同样的,对于这是针对全局Histogram只有一个凹槽的OTSU,那么如果Histogram波浪起伏呢?这个时候就可以分段来提取了,比如我在0-127做一遍OTSU,阈值下0阈值上我给127, 然后再对剩下的继续OTSU,就这样。前提是需要提前观察好图像的特征,所有方法都不是死搬硬套的,要针对具体问题来改变。

    五,形态学操作

    形态学操作也是我用的比较多的。讲出这个概念,大概第一反应就要想到膨胀和腐蚀了,在OpenCV里函数直接就是dilate和erode。除了膨胀腐蚀还有开运算和闭运算,说白了就是开运算:先腐蚀后膨胀,闭运算:先膨胀后腐蚀。关于膨胀腐蚀的概念和源码可以看看:

    腐蚀与膨胀(Eroding and Dilating)

    我当时学的时候到这里就很疑惑,为什么有了膨胀腐蚀还要开运算闭运算呢?其实开闭运算最重要的一点就是,可以保持物体原有大小。然后一个是消除物体内部孔洞的另一个是增强物体之间连接点的,当然要根据背景是黑是白来确定用那个,用0还是1的kernel等等。

    kernel = np.ones((10, 10), dtype=np.uint8)
    img = cv2.erode(img, kernel=kernel, iterations=1)
    img = cv2.dilate(img, kernel=kernel, iterations=1)

    很多人知道filter2D的kernel必须要奇数,但是这里形态学并不是。首先明确形态学操作也是对二值图进行的,简单来讲就是你图上这一块和我的kernel都一样我就置为255,不一样我就置为0,当然erode和dilate是相反的,其实跟背景也有很多关系,所以有时候我会:

    img = cv2.erode(255-img, kernel=kernel, iterations=1)

    就不用想太多,show一下看看不行了再调回去。然后iteration就是指迭代几次,比如iterations=2下面两行是等价的:

    img = cv2.erode(img, kernel=kernel, iterations=2)
    img = cv2.erode(cv2.erode(img, kernel=kernel, iterations=1), kernel=kernel, iterations=1)

    然后开闭运算就是:

    img = cv2.dilate(cv2.erode(img, kernel=kernel, iterations=1), kernel=kernel, iterations=1)
    img = cv2.erode(cv2.dilate(img, kernel=kernel, iterations=1), kernel=kernel, iterations=1)


    是不是很简单?其实OpenCV里还有个专门的morphology来进行开运算闭运算,据说有一些改变,效果会好一些(一个大佬建议我尽量用morphology的),反正我是一直觉得差不多。

    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

    除此之外open和close还有一点用就是也可以作为边界的提取。就是拿Open的图片减去close的图片就好了,morphology里也有专门的参数,反正我还是觉得下面两个等价的。

    edges = opening - closing
    edges = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

    有时候我也会设置一些奇葩的kernel比如不全1啊等等,还有可以用不同大小的kernel来分别erode和dilate,我就用过10X1的kernel先膨胀再用1X10的腐蚀回来,当时是为了消除一些水平线我记得。

    六,其他:

    反正这个就是想到什么说什么呗。先说下大概要说啥,今天累了。

    1. 聚类cluster,K-means算法 (OK)2. Region Growing,分水岭算法watershed 3. Super pixel,这个算是为机器学习做个铺垫吧。

    先说一些其他的常用函数,然后讲下k-means。

    其他常用函数:

    首先经常用的resize函数,用来调整图片大小的,一般在调整时候尽量保持长宽比不要变吧,不然很容易丢失原始图像的细节。

    img= cv2.resize(img, (256, 256))

    聚类(Cluster)-->K-means

    这个算法也是用于图像分割的,先了解下K的意思大概是类别数,means就是均值。算法大概的意思就是:

    首先,在一张图里随机生成K个小点,作为K个核,然后以这些核为中心。

    然后,对于每个像素点,计算他与这K个核的距离,类别归为距离最小的核那个。

    此时,对于一个图片来讲,就分成了K个区域。

    再然后,对这K个区域分别计算均值,这里敲黑板,这个均值不是像素的灰度值的均值,而是像素坐标点的均值!!!然后把计算得到的那个均值(也就是那个像素坐标点)作为新的核,此时就重新产生了K个核。

    再重新计算每个像素点与K个核的距离,然后再更新K个核,反复进行,直到所有的核的位置不再变,也就是计算均值得到的新核与过往的旧核重合,此时结束。

    就是如下图这个意思(引【十大经典数据挖掘算法】k-means - Treant - 博客园)

    b87ee87d15e5e856f8ae0e4f456f3b8e.png

    当然K-means最大的缺点就是,太依赖于最开始随机产生的核,所以很容易产生局部最优解而不是全局最优解,理解一下就是下面这样的。

    326abf06d4bf91e4258c2932edfbb9e1.png

    就是有三类吧,最优解当然是导数为零的地方,然后开始的K的点(红色)全跑到中间那一类里面了,就只能找到一类了,就很难受是吧,也可能两类。

    所以我用K-means的时候一般会设置个flag条件,达不到一直循环K-means,这样的后果就是费cpu还占时间,所以我一般不用啊。建议个人学习玩玩,如果真工作千万不要用,主要一点就是不稳定。

    你说你设个flag循环个千八百次总有一次初始随机点比较正常满足要求的,但万一呢?万一你就要被老板骂一顿了。讲道理K-means我用的是sklearn的,所以就不再贴代码了。opencv我不确定有没有。。。

    那么K-means的意义在哪里呢?其实这就是一个机器学习的例子,是无监督的学习,学学原理对将来是有好处的,多学无害嘛毕竟,而且K-means的代码实现起来也不难,可以自己写写K-means的算法,提升提升自己。OK,K-means就这样了,有问题的欢迎来讨论哈~~

    区域生长(Region Growing)-->Watershed

    这也是用于图像分割的非监督学习算法,通用的解释都是把这个算法等效成高低起伏的山山上还有些小坑那种。

    你想啊,好多个连着的山,一个挨着一个,这个时候采用传统阈值分割,就很难把山和山分开(采用聚类的K-means应该还行),但是要注意有山峰还有山谷啊,还有那些坑对吧。假想有一场一直下着的雨,那么水往低处流,水填充的地方就可以很好的把山和山给分开,甚至于山上的一些小坑也能分的出来。

    这里山的陡峭程度就是图像的梯度,就是图像变化特别剧烈的部分。唉口语怎么感觉说不清呢?直接引一下百度百科吧:

    在该算法中,分水岭计算分两个步骤,一个是排序过程,一个是淹没过程。首先对每个像素的灰度级进行从低到高排序,然后在从低到高实现淹没过程中,对每一个局部极小值在h阶高度的影响域采用先进先出(FIFO)结构进行判断及标注。

    就是,想象一个二维的图,你把它想成三维的,xy轴然后每个坐标点的灰度值当z轴,有画面了吧,一个高低起伏的三维立体图。然后你就想象拿一壶水网这图里倒,就行了。水位线以下一点距离再往下的给个label -1(背景), 水位线以上一点距离再往上给个label 1(前景),水位线附近的给个label 0(边界)。然后吧label等于某一值的赋值就好了。类似这样:

    5ee2505cd2f173c9498a19b8ffa71ad6.png
    markers = cv2.watershed(img,markers)
    img[markers == -1] = [255,0,0]

    注意一点不要把读入的图片直接拿来用,最好先预处理下,腐蚀膨胀下之类的,效果会好很多。

    Super Pixel

    这个概念其实是很类似于机器学习里的pooling操作的,主要目的是为了在保留图像大致信息的情况下缩小图像的尺寸,其实也不绝对。反正看看下面这两个图片大概就明白了吧。

    2de7de48e3e1e1e49dae94d5e170a39d.png

    182f8bb337b1bf69432add67345f1d31.png

    上面那个图可以抽象为下面这个图,而且绝大部分的信息(包括边界,形状,颜色等等)都被保留了,同时还可以相当于缩小了大小(把那些看着块状的区域直接替代下就行了)。有感觉 了吧,superpixel其实在传统cv里没什么用(我感觉),在CNN等机器学习网络里常用pooling也就是池化层来实现,比如maxpooling,averagepooling,网上有很多相关的资料。下图放一个maxpooling的吧。

    1a280ea56ec971548a4de9a7e6aa087d.png

    这个是步长为二的最大值池化,就是2*2里面选最大的像素点的灰度值来代替这四个像素点的坐标值。以此类推。pooling步长的选择一般都是2,太大的话会丢失很多信息,再小,,1有个p用啊,,,所以就2了一般。


    我觉得我的第一篇图像处理相关的基本该说的也都说了,更的过程中也收了一些点赞,但没feedback啊建议啊之类的,欢迎大家一起探讨啊~

    最后,网上有很多资源,有很多大佬写的教程啊什么的,我之前从中受益良多,学会了很多东西,这也是我加入自己理解后分享出来的原因吧。

    大家一起互帮互助走向人生巅峰啊~

    其他有什么需要的提醒我下,会的话我也加上。

    小白一个,初次更,也没画什么图啊什么的,有些可能讲的也不一定清楚,也不一定有人看。。。。反正如果你看了麻烦给个建议啊feedback啊什么的,实在没啥讲的就点个赞吧。

    更多相关内容
  • python 高斯白噪声-python高斯噪声

    千次阅读 2020-10-30 23:03:49
    噪声时间序列的例子在本节中,我们将使用python创建一个高斯噪声序列并做一些检查。 它有助于在实践中创建和评估白噪声时间序列。 它将提供参考框架和示例图并且使用和比较自己的时间序列项目的统计测试,以检查...

    flbm1hkjk6.jpg广告关闭

    2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品。未来,我们一起乘风破浪,创造无限可能。

    d17lwwvobg.png

    白噪声时间序列的例子在本节中,我们将使用python创建一个高斯白噪声序列并做一些检查。 它有助于在实践中创建和评估白噪声时间序列。 它将提供参考框架和示例图并且使用和比较自己的时间序列项目的统计测试,以检查它们是否为白噪声首先,我们可以使用随机模块的gauss()函数创建一个1,000个随机高斯变量的列表。 我们...

    重复3,4两个步骤完成所有像素的np个像素输出加噪以后的图像高斯噪声概述:加性高斯白噪声(additive white gaussian noise,awgn)在通信领域中指的是一种...python数字图像处理-图像噪声与去噪算法? 图像噪声椒盐噪声概述:椒盐噪声(salt & pepper noise)是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是...

    如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。? - 椒盐噪声(salt-and-pepper noise)是指两种噪声,一...obstacle_image.jpg)pylab.show()(二)python代码学习-数据处理:图片加噪声? 数据加噪:- 高斯噪声(gaussian noise)是指它的概率密度函数服从高斯分布的...

    python代码如下:import torchimport torch.nn as nnimport torch.nn.functional as f input =torch.randn(3, requires_grad=true) #从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的3个随机数target =torch.empty(3).random_(2) # 生成3个值,值为0 或者 1 #二值交叉熵,这里输入要经过sigmoid处理out = f...

    给图像加入噪声skimage.util.random_noise(image, mode="gaussian’, seed=none,clip=true,**kwargs)该函数可以方便的为图像添加各种类型的噪声如高斯白噪声、椒盐噪声等。 参数介绍 image为输入图像数据,类型应为ndarray,输入后将转换为浮点数。 mode选择添加噪声的类别。 字符串str类型。 应为以下几种之一:"...

    0fp4n2fjre.jpeg

    对图像中的像素添加噪声扰动,比如椒盐噪声、高斯白噪声等。 颜色变换。 改变图像的亮度、清晰度、对比度、锐度等。 如果你对图像处理并不是那么熟悉,不用慌张,对于万能的python而言,只要有需求,总有人提供程序库,github上就有一个imgaug的python库,下面展示一些图像扩充的样例:? 通过数据扩充,我们可以将...

    vscjzip68r.png

    如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。 高斯白噪声的二阶矩不相关,一阶矩为常数,是指先后...效果:可以看出,双边滤波后的边缘保留的比高斯滤波好? python实现1、方框滤波、均值滤波、高斯滤波import cv2import numpy as npif__name__ == __main...

    1ss6t7sp6p.png

    平稳分为严平稳和宽平稳,严平稳保证时间序列的任何有限维分布对于时间的平移是不变的,比如高斯白噪声就是严平稳序列; 宽平稳则要求协方差结构随时间的...图2具体实现以python为例。 step1、读取时间序列df =pd.read_csv(testdata.csv, encoding=gbk, index_col=ddate)#时间序列索引转换为日期格式df.index = ...

    为抑制各 imf 分量之间出现混频,norden huang在 emd分解中,运用添加均值为零的高斯白噪声进行辅助分析,即eemd算法。 eemd算法的基本原理eemd方法实质上...eemd分解算法基于白噪声频谱均衡的分布特点来均衡噪声,使得频率的分布趋于均匀。 添加的白噪声不同信号的幅值分布点带来的模态混叠效应。 python实现eemd...

    def write_sine(path:str, freq:float, rate:int=44100, duration:int=5):samples = rate * duration x = np.linspace(0, duration, samples) vals =np.sin(2 * np.pi * freq * x) data = np.array(vals * (2 ** 15 - 1),int16).tostring() write_wave(path, data) 高斯白噪声高斯白噪声直接使用np.random.randn 函数...

    xiseedcact.png

    二维高斯函数为:? 高斯噪声的产生图像传感器在拍摄时视场不够明亮、亮度不够均匀; 电路各元器件自身噪声和相互影响; 图像传感器长期工作,温度过高...通常,在去除噪音的情况下,侵蚀之后是扩张。 因为,侵蚀会消除白噪声,但它也会缩小我们的物体。 所以我们扩大它。 由于噪音消失了,它们不会再回来,但...

    sifdgewgle.jpeg

    高斯模糊(gaussian blurring)是使用"值”具有高斯分布的核函数。 由于这些值是由高斯函数生成的,因此它的参数需要一个sigma值。 如上图,内核的值在靠近中心的地方变高,在靠近角的地方变小。 将该方法应用于具有正态分布的噪声,如白噪声,效果较好。 双边滤波(bilateral filtering)是高斯模糊的一个高级版本...

    在假设基线不包含系统信号(对感兴趣的事件进行时间锁定)的情况下,白化基线信号应遵循多元高斯分布,即,在给定的条件下,白化基线信号应在-1.96和1.96...诸如mne的源估计方法需要从记录中进行噪声估计。 在本教程中,我们介绍了噪声协方差的基础知识,并构造了一个噪声协方差矩阵,该矩阵可在计算逆解时使用...

    4ryk7pqry2.png

    下面是总结:结语简而言之,本文讨论了一个拟合多变量回归模型的方法,它适用于高度非线性、具有耦合项并且含有噪声的数据集。 我们知道了如何利用python...对于更高级的具有非多项式特征的模型,你可以看看sklearn中关于核回归或支持向量机的内容。 还有这篇文章有对高斯核回归的介绍。 http:mccormickml...

    选自efavdb作者: jonathan landy机器之心编译参与:白悦、蒋思源高斯过程可以被认为是一种机器学习算法,它利用点与点之间同质性的度量作为核函数,以从输入的训练数据预测未知点的值。 本文从理论推导和实现详细地介绍了高斯过程,并在后面提供了用它来近似求未知函数最优解的方法。 我们回顾了高斯过程(gp)拟合...

    gixji5vxqm.jpeg

    作者: jonathan landy机器之心编译参与:白悦、蒋思源高斯过程可以被认为是一种机器学习算法,它利用点与点之间同质性的度量作为核函数,以从输入的训练数据预测未知点的值。 本文从理论推导和实现详细地介绍了高斯过程,并在后面提供了用它来近似求未知函数最优解的方法。 我们回顾了高斯过程(gp)拟合数据所需的...

    同时,通过gpu的辅助,ssfm的计算速度也可以进一步提升。 ? gn模型则根据假设信号和噪声都遵循高斯分布, 通过数值运算得到非线性噪声的噪声功率谱密度...我们利用半仿真半数值解的方案来实现:模拟一个awgn信道,在发端产生符号序列,将原有gn模型上得到的非线性噪声和ase噪声视为信道中的白噪声...

    噪音数据的加入高斯噪声、模糊处理# noisy_image_tensor = image_tensor +tf.cast(50 * tf.random_normal(shape=, mean=0, stddev=0.1),tf.uint8)noisy...前言:用cnn进行训练模型的时候,通常需要对图像进行处理,有时候也叫做数据增强,常见的图像处理的python库:opencv、pil、matplotlib、tensorflow等...

    0avvh5jcth.png

    的最大值adaptivemethod - 自适应阈值算法,平均(adaptive_thresh_mean_c)或高斯(adaptive_thresh_gaussian_c)thresholdtype -阈值类型,必须为thresh...从而实现二值化处理,目的是滤除太大或太小值像素、消除噪声,从而从灰度图中获取二值图像(将图像的灰度值设置为0或255),实现增强整个图像呈现更为明显...

    image.jpg

    是对未来理想的高斯模糊; 是对纷杂凌乱投资方法的傅里叶变换,统一成"买房致富”。 317的连环雷炸肿的炒房客的脸,一秒钟变猪头是一种怎么样的体验? 然而终究还在担心,究竟会不会降。 找个男女朋友的话题,是过年回家餐桌上的白噪声,任你对音频了如指掌,在三姑大姨的面前也无法降噪; 是情绪的crash率; 是tapd...

    展开全文
  • python程序如下 首先用标准差为5的5*5高斯算子对图像进行平滑处理,然后利用Laplace的扩展算子对图像进行边缘检测。 import numpy as np from PIL import Image import matplotlib.pyplot as plt import matplotlib...

    如果需要检测到图像里面的边缘,首先我们需要知道边缘处具有什么特征。

    对于一幅灰度图像来说,边缘两边的灰度值肯定不相同,这样我们才能分辨出哪里是边缘,哪里不是。

    因此,如果我们需要检测一个灰度图像的边缘,我们需要找出哪里的灰度变化最大。显然,灰度变化越大,对比度越强,边缘就越明显。

    那么问题来了,我们怎么知道哪里灰度变化大,哪里灰度变化小呢?

    导数,梯度,边缘信息

    在数学中,与变化率有关的就是导数。

    如果灰度图像的像素是连续的(实际不是),那么我们可以分别原图像G对x方向和y方向求导数

    665b5d1a12e316e58950cb0a8e2a9cd1.png

    获得x方向的导数图像Gx和y方向的导数图像Gy。Gx和Gy分别隐含了x和y方向的灰度变化信息,也就隐含了边缘信息。

    如果要在同一图像上包含两个方向的边缘信息,我们可以用到梯度。(梯度是一个向量)

    原图像的梯度向量Gxy为(Gx,Gy),梯度向量的大小和方向可以用下面两个式子计算

    64c0118414bb7a6dfcf8e12a2f380984.png
    56e1cdeb3abe11944c81a4d872e63a45.png

    角度值好像需要根据向量所在象限不同适当+pi或者-pi。

    梯度向量大小就包含了x方向和y方向的边缘信息。

    图像导数

    实际上,图像矩阵是离散的。

    连续函数求变化率用的是导数,而离散函数求变化率用的是差分。

    差分的概念很容易理解,就是用相邻两个数的差来表示变化率。

    下面公式是向后差分

    x方向的差分:Gx(n,y) = G(n,y)-G(n-1,y)

    y方向的差分:Gy(x,n) = G(x,n)-G(x,n-1)

    实际计算图像导数时,我们是通过原图像和一个算子进行卷积来完成的(这种方法是求图像的近似导数)。

    最简单的求图像导数的算子是 Prewitt算子 :

    x方向的Prewitt算子为

    d942baa361ef4fc56a0470b5096c3751.png

    y方向的Prewitt算子为

    8185f9092e83f538956775496b85a5ac.png

    原图像和一个算子进行卷积的大概过程如下

    如果图像矩阵中一块区域为

    3cd5c8234cafe82627946300d083ec4e.png

    那么x5处的x方向的导数是,将x方向算子的中心和x5重合,然后对应元素相乘再求和,即

    x5处的x方向导数为x3+x6+x9-x1-x4-x7

    对矩阵中所有元素进行上述计算,就是卷积的过程。

    因此,利用原图像和x方向Prewitt算子进行卷积就可以得到图像的x方向导数矩阵Gx,

    利用原图像和y方向Prewitt算子进行卷积就可以得到图像的y方向导数矩阵Gy。

    利用公式

    de50d77ea2e0e9607ca6819ab93abc42.png

    就可以得到图像的梯度矩阵Gxy,这个矩阵包含图像x方向和y方向的边缘信息。

    Python实现卷积及Prewitt算子的边缘检测

    首先我们把图像卷积函数封装在一个名为imconv的函数中 ( 实际上,scipy库中的signal模块含有一个二维卷积的方法convolve2d() )

    复制代码

    import numpy as np

    def imconv(image_array,suanzi):

    '''计算卷积

    参数

    image_array 原灰度图像矩阵

    suanzi 算子

    返回

    原图像与算子卷积后的结果矩阵

    '''

    image = image_array.copy() # 原图像矩阵的深拷贝

    dim1,dim2 = image.shape

    # 对每个元素与算子进行乘积再求和(忽略最外圈边框像素)

    for i in range(1,dim1-1):

    for j in range(1,dim2-1):

    image[i,j] = (image_array[(i-1):(i+2), (j-1):(j+2)]*suanzi).sum()

    # 由于卷积后灰度值不一定在0-255之间,统一化成0-255

    image = image*(255.0/image.max())

    # 返回结果矩阵

    return image

    然后我们利用Prewitt算子计算x方向导数矩阵Gx,y方向导数矩阵Gy,和梯度矩阵Gxy。

    import numpy as np

    # x方向的Prewitt算子

    suanzi_x = np.array([[-1, 0, 1],

    [ -1, 0, 1],

    [ -1, 0, 1]])

    # y方向的Prewitt算子

    suanzi_y = np.array([[-1,-1,-1],

    [ 0, 0, 0],

    [ 1, 1, 1]])

    # 打开图像并转化成灰度图像

    image = Image.open("pika.jpg").convert("L")

    # 转化成图像矩阵

    image_array = np.array(image)

    # 得到x方向矩阵

    image_x = imconv(image_array,suanzi_x)

    # 得到y方向矩阵

    image_y = imconv(image_array,suanzi_y)

    # 得到梯度矩阵

    image_xy = np.sqrt(image_x**2+image_y**2)

    # 梯度矩阵统一到0-255

    image_xy = (255.0/image_xy.max())*image_xy

    # 绘出图像

    plt.subplot(2,2,1)

    plt.imshow(image_array,cmap=cm.gray)

    plt.axis("off")

    plt.subplot(2,2,2)

    plt.imshow(image_x,cmap=cm.gray)

    plt.axis("off")

    plt.subplot(2,2,3)

    plt.imshow(image_y,cmap=cm.gray)

    plt.axis("off")

    plt.subplot(2,2,4)

    plt.imshow(image_xy,cmap=cm.gray)

    plt.axis("off")

    plt.show()

    Prewitt算子 的结果如下图所示

    上方:左图为原图像,右图为x方向导数图像

    下方:左图为y方向导数图像,右图为梯度图像

    9f411594433edd3799ae62ebe292d35b.png

    从图中可以看出,Prewitt算子虽然能检测出图像边缘,但是检测结果较为粗糙,还带有大量的噪声。

    近似导数的Sobel算子

    Sobel算子与Prewitt比较类似,但是它比Prewitt算子要好一些。

    x方向的Sobel算子为

    7455b2684d7b53ae25d254eeb4eabc7e.png

    y方向的Sobel算子为

    85ab5aafccf22d5474d6ca37ceb361c5.png

    python代码只需要将上面代码中的Prewitt算子改成Sobel算子即可。

    # x方向的Sobel算子

    suanzi_x = np.array([[-1, 0, 1],

    [ -2, 0, 2],

    [ -1, 0, 1]])

    # y方向的Sobel算子

    suanzi_y = np.array([[-1,-2,-1],

    [ 0, 0, 0],

    [ 1, 2, 1]])

    Sobel算子 的结果如下图所示

    上方:左图为原图像,右图为x方向导数图像

    下方:左图为y方向导数图像,右图为梯度图像

    e509f5fdf1b9e7c05bc98faaa6bc96e5.png

    从图中看出,比较Prewitt算子和Sobel算子,Sobel算子稍微减少了一点噪声,但噪声还是比较多的。

    近似二阶导数的Laplace算子

    Laplace算子是一个二阶导数的算子,它实际上是一个x方向二阶导数和y方向二阶导数的和的近似求导算子。

    实际上,Laplace算子是通过Sobel算子推导出来的。

    Laplace算子为

    d42ea7195e37ce3e982964b81aa2f8d4.png

    Laplace还有一种扩展算子为

    fff62a90b59a2a38a4e901a0743ef0ba.png

    为了不再重复造轮子,这次我们运用scipy库中signal模块的convolve()方法来计算图像卷积。

    convolve()的第一个参数是原图像矩阵,第二个参数为卷积算子,然后指定关键字参数mode="same"(输出矩阵大小和原图像矩阵相同)。

    import numpy as np

    from PIL import Image

    import matplotlib.pyplot as plt

    import matplotlib.cm as cm

    import scipy.signal as signal # 导入sicpy的signal模块

    # Laplace算子

    suanzi1 = np.array([[0, 1, 0],

    [1,-4, 1],

    [0, 1, 0]])

    # Laplace扩展算子

    suanzi2 = np.array([[1, 1, 1],

    [1,-8, 1],

    [1, 1, 1]])

    # 打开图像并转化成灰度图像

    image = Image.open("pika.jpg").convert("L")

    image_array = np.array(image)

    # 利用signal的convolve计算卷积

    image_suanzi1 = signal.convolve2d(image_array,suanzi1,mode="same")

    image_suanzi2 = signal.convolve2d(image_array,suanzi2,mode="same")

    # 将卷积结果转化成0~255

    image_suanzi1 = (image_suanzi1/float (image_suanzi1.max()))*255

    image_suanzi2 = (image_suanzi2/float (image_suanzi2.max()))*255

    # 为了使看清边缘检测结果,将大于灰度平均值的灰度变成255(白色)

    image_suanzi1[image_suanzi1> image_suanzi1.mean()] = 255

    image_suanzi2[image_suanzi2> image_suanzi2.mean()] = 255

    # 显示图像

    plt.subplot(2,1,1)

    plt.imshow(image_array,cmap=cm.gray)

    plt.axis("off")

    plt.subplot(2,2,3)

    plt.imshow(image_suanzi1,cmap=cm.gray)

    plt.axis("off")

    plt.subplot(2,2,4)

    plt.imshow(image_suanzi2,cmap=cm.gray)

    plt.axis("off")

    plt.show()

    结果如下图

    其中上方为原图像

    下方:左边为Laplace算子结果,右边为Laplace扩展算子结果

    0529f87875ec42e0c48d6c65f6468af6.png

    从结果可以看出,laplace算子似乎比前面两个算子(prewitt算子和Sobel算子)要好一些,噪声减少了,但还是比较多。

    而Laplace扩展算子的结果看上去比Laplace的结果少一些噪声。

    降噪后进行边缘检测

    为了获得更好的边缘检测效果,可以先对图像进行模糊平滑处理,目的是去除图像中的高频噪声。

    python程序如下

    首先用标准差为5的5*5高斯算子对图像进行平滑处理,然后利用Laplace的扩展算子对图像进行边缘检测。

    import numpy as np

    from PIL import Image

    import matplotlib.pyplot as plt

    import matplotlib.cm as cm

    import scipy.signal as signal

    # 生成高斯算子的函数

    def func(x,y,sigma=1):

    return 100*(1/(2*np.pi*sigma)) *np.exp(-((x-2)**2+(y-2)**2)/(2.0*sigma**2))

    # 生成标准差为5的5*5高斯算子

    suanzi1 = np.fromfunction(func,(5,5),sigma=5)

    # Laplace扩展算子

    suanzi2 = np.array([[1, 1, 1],

    [1,-8, 1],

    [1, 1, 1]])

    # 打开图像并转化成灰度图像

    image = Image.open("pika.jpg").convert("L")

    image_array = np.array(image)

    # 利用生成的高斯算子与原图像进行卷积对图像进行平滑处理

    image_blur = signal.convolve2d(image_array, suanzi1, mode= "same")

    # 对平滑后的图像进行边缘检测

    image2 = signal.convolve2d(image_blur, suanzi2, mode="same")

    # 结果转化到0-255

    image2 = (image2/float(image2.max()))*255

    # 将大于灰度平均值的灰度值变成255(白色),便于观察边缘

    image2[image2>image2.mean()] = 255

    # 显示图像

    plt.subplot(2,1,1)

    plt.imshow(image_array,cmap=cm.gray)

    plt.axis("off")

    plt.subplot(2,1,2)

    plt.imshow(image2,cmap=cm.gray)

    plt.axis("off")

    plt.show()

    结果如下图

    c780c9543990cb0e03540236525e3ed5.png

    从图中可以看出,经过降噪处理后,边缘效果较为明显。

    展开全文
  • 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。消除图像中的噪声成分叫作图像的平...

    线性滤波

    本次教程将介绍几种OpenCV常用的滤波器,将介绍它们详细的原理,图像滤波对于OpenCV图像处理来说是至关重要的一环,它在整个OpenCV中的分量是举足轻重的,我们必须完完全全的掌握它。

    图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。

    消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。

    图像滤波的目的有两个:

    • 一是抽出对象的特征作为图像识别的特征模式。

    • 另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。

    而对滤波处理的要求也有两条:

    • 一是不能损坏图像的轮廓及边缘等重要信息。

    • 二是使图像清晰视觉效果好。

    平滑滤波是低频增强的空间域滤波技术。它的目的有两类:

    • 一类是模糊。

    • 一类是消除噪音。

    空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。

    关于滤波器,一种形象的比喻法是:我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。

    ▼ 原理

    邻域算子(局部算子)是利用给定像素周围的像素值的决定此像素的最终输出值的一种算子。而线性邻域滤波是一种常用的邻域算子,像素的输出值取决于输入像素的加权和,具体过程如下图:

    bad5e37f725421c6e6a617c1a9f9208d.png

    左边图像与中间图像的卷积产生右边图像。目标图像中蓝色标记的像素是利用原图像中红色标记的像素计算得到的。

    邻域算子除了用于局部色调调整以外,还可以用于图像滤波,实现图像的平滑和锐化,图像边缘增强或者图像噪声的去除。本篇文章,我们介绍的主角是线性邻域滤波算子,即用不同的权重去结合一个小邻域内的像素,来得到应有的处理效果。

    线性滤波处理的输出像素值7425a8fc949267a40710b62483bd5819.png是输入像素值8b293cc229d7d1e04bee9d77169a6a24.png的加权和 :

    08ec61be64cfe315372f2d9ca5f24c00.png

    其中的加权和我们称其为“核”,滤波器的加权系数,即滤波器的“滤波系数”。

    上面的式子可以简单写作:

    c01159899abb670550468bad525aab92.png

    其中f表示输入像素值,h表示加权系数“核“,g表示输出像素值

    在新版本的OpenCV中,提供了如下三种常用的线性滤波操作,他们分别被封装在单独的函数中,使用起来非常方便:

    • 均值滤波——blur函数

    • 方框滤波——boxblur函数

    • 高斯滤波——GaussianBlur函数

    ▼ 均值滤波器

    均值滤波器是一种低通滤波器,也是线性滤波器。对于一幅图像,我们都知道其像素值在0-255,通常来讲,滤波器所用的一个滤波模板都为奇数,这里我们以3*3为例:

    8a6bbcf036c9f02b8cbafd3c0aa044af.png

    中间黄色部分即为滤波器的模板(卷积核),其将用于与图像进行卷积进而滤波,对于均值滤波器,顾名思义,其像素点为中间九个像素值的均值,从而将整个图像的像素用这个均值像素代替:

    45a1cd2dfefc1298c8000cbfa49a9bc9.png

    函数原型:

    dst=cv.blur(src,ksize [,dst [,anchor [,borderType]]])

    其中第一个参数为输入的图像,第二个参数为卷积核的大小,后面的我们都采用默认值就可以。

    给出示例代码:

    import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("cat.jpg")blur = cv2.blur(img,(5,5))cv2.imshow("org",img)cv2.imshow("result", blur)cv2.waitKey(0)cv2.destroyAllWindows()

    d6689624af4c2063c9090dcb5abeecae.png

    缺陷:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声。

    ▼ 方框滤波器

    事实上,方框滤波器与均值滤波器是基本上一样的,我们直接看源码:

    import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("shu.jpg")blur = cv2.boxFilter(img,-1,(3,3),normalize=False)cv2.imshow("org",img)cv2.imshow("result", blur)cv2.waitKey(0)cv2.destroyAllWindows()

    boxFilter则为i方框滤波函数,当

    normalize=True

    它就完全相当于是一个均值滤波器,滤波像素值计算方法也是均值计算,如图:

    cf3acce60653c264c68ccab6404c7847.png

    但是当

    normalize=False

    其并非均值,而是卷积核中所有的像素值相加,不除9,那么对于大于255的值,它会全取255进行代替,如图:

    ede44cffd8ddcbbbd4455b0feba79d31.png

    ▼ 高斯滤波

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值

    先来了解一下高斯函数,高斯分布函数指的就是概率论中的正态分布的概率密度函数,均值μ=0时的一维形式和二维形式如下。其中σ为正态分布的标准偏差,其值决定了函数的衰减快慢。

    7fbdcd788bd27682a131a0bdb5fa339b.png

    088bd1976da3cfc2778f0d2aef47bb5d.png

    从这两个公式不难看出,二维公式其实等于两个一维函数相乘。从概率论角度看,因为随机变量X,Y是相互独立的,那么他们的联合概率密度就等于边缘概率密度之积。这个特性是非常重要的,现在让我们先看一下高斯函数的图像分布与二维高斯卷积核的样子:

    f037ebcac88214725d541cca4e533f0c.png

    e209b559b4fa7081e14cc5218489030e.png

    图像上,靠近原点的位置地势高,距离原点越远则地势越低。相应地,卷积核也是中心数值最大,并向四周减小,减小的幅度并不是随意的,而是要求整个卷积核近似高斯函数的图像。由于高斯滤波实质是一种加权平均滤波,为了实现平均,核还带有一个系数,例如上图中的十六分之一、八十四分之一,这些系数等于矩阵中所有数值之和的倒数。

    可能有人看不太懂,我简单解释一下高斯滤波的原理,以下面那个数字图为例:

    8a6bbcf036c9f02b8cbafd3c0aa044af.png

    假设中间的204为中心点,高斯滤波的原理就是距离中心点最近其权重系数越大,就类似这样一个图:

    0dbe813ad9c8c6db10640fb8b3e7d957.png

    那么距离204越近则其权重系数越大,它跟均值滤波还是有很大不同的,均值滤波对于204周围的75和24这两个较小值非常的不友好,会导致误差较大。但是高斯滤波表示,离我近的,吃嘛嘛香,离我远的,说话分量就没有那么重了,不管你值有多大或者多小。我们看一下函数原型:

    GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]])-> dst

    • src输入图像;图像可以具有任意数量的通道,这些通道可以独立处理,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。

    • dst输出图像的大小和类型与src相同。

    • ksize高斯内核大小。ksize.width和ksize.height可以不同,但它们都必须为正数和奇数,也可以为零,然后根据sigma计算得出。

    • sigmaX X方向上的高斯核标准偏差。

    • sigmaY Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出;为了完全控制结果,而不管将来可能对所有这些语义进行的修改,建议指定所有ksize,sigmaX和sigmaY。

    我们来看代码:

    import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("shu.jpg")blur =  cv2.GaussianBlur(img,(3,3),0)cv2.imshow("org",img)cv2.imshow("result", blur)cv2.waitKey(0)cv2.destroyAllWindows()

    b6fcbf82612ef18afeb3075c8c028177.png

    我们可以看到,三种线性滤波器都无法很好的去除图片中的椒盐噪声,而要想去除椒盐噪声,我们需要用非线性滤波器,这将在下次介绍。现在我们来总结一下这三种滤波器:

    d110e9ff77ab14b71fd3e5e37d98a66e.png

    非线性滤波

    我们在上个教程中谈到了线性滤波,相比较而言,线性滤波中的高斯滤波最为受欢迎,但是我们也遗留了一个问题,线性滤波对于椒盐噪声的过滤并不是很好,由此我们本次将谈到OpenCV中的非线性滤波。

    之前我们说的线性滤波,即两个信号之和的响应和他们各自响应之和相等。换句话说,每个像素的输出值是一些输入像素的加权和,线性滤波器易于构造,并且易于从频率响应角度来进行分析。

    其实在很多情况下,使用邻域像素的非线性滤波也许会得到更好的效果。比如在噪声是散粒噪声而不是高斯噪声,即图像偶尔会出现很大的值的时候。在这种情况下,用高斯滤波器对图像进行模糊的话,噪声像素是不会被去除的,它们只是转换为更为柔和但仍然可见的散粒。这就到了中值滤波登场的时候了。

    ▼ 中值滤波

    中值滤波是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节。

    中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,其基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点,对于斑点噪声和椒盐噪声来说尤其有用,因为它不依赖于邻域内那些与典型值差别很大的值。中值滤波器在处理连续图像窗函数时与线性滤波器的工作方式类似,但滤波过程却不再是加权运算。

    中值滤波在一定的条件下可以克服常见线性滤波器如最小均方滤波、方框滤波器、均值滤波等带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息, 保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。

    顾名思义,中值滤波选择每个像素的邻域像素中的中值作为输出,或者说中值滤波将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。

    通俗的来讲,就找中位数嘛,仍然以那个图为例:

    8a6bbcf036c9f02b8cbafd3c0aa044af.png

    我们将值从小到大排列一下:

    24 75 78 104 113 121 154 204 235

    那么中间值就是113了。

    一般采用奇数点的邻域来计算中值,但如果像素点数为偶数时,中值就取排序像素中间两点的平均值。

    中值滤波对于去除椒盐噪声特别的有效,我们先来看一下椒盐噪声的定义:

    椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声是指两种噪声,一种是盐噪声(salt noise)盐=白色(255),另一种是胡椒噪声(pepper noise),椒=黑色(0)。前者是高灰度噪声,后者属于低灰度噪声。一般两种噪声同时出现,呈现在图像上就是黑白杂点。对于彩色图像,则表现为在单个像素BGR三个通道随机出现的255与0,而中值滤波的取值恰恰是中间值,所以会将这些极端值过滤掉,我们来看函数原型:

    dst=cv.medianBlur(src,ksize [,dst])

    • dst为输出的图像

    • src为输入的图像

    • ksize为卷积核的大小,它必须为奇数且大于1

    代码如下:

    import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("shu.jpg")blur =  cv2.medianBlur(img,3)cv2.imshow("org",img)cv2.imshow("result", blur)cv2.waitKey(0)cv2.destroyAllWindows()

    如图:

    73033a396e6608bb3fccee1b79e52e24.png

    可以看到去除椒盐噪声的效果十分明显,我们来总结一下中值滤波的优缺点。

    中值滤波器与均值滤波器比较的优势:在均值滤波器中,由于噪声成分被放入平均计算中,所以输出受到了噪声的影响,但是在中值滤波器中,由于噪声成分很难选上,所以几乎不会影响到输出。因此同样用3x3区域进行处理,中值滤波消除的噪声能力更胜一筹。中值滤波无论是在消除噪声还是保存边缘方面都是一个不错的方法。

    中值滤波器与均值滤波器比较的劣势:中值滤波花费的时间是均值滤波的5倍以上。

    ▼ 双边滤波

    双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。

    双边滤波器的好处是可以做边缘保存,一般过去用的高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。

    它的原理大致如图:

    96cff03dd41c5df70512ee0af8607169.png

    为了理解双边滤波的距离和像素差两个影响因素,先说明下面两个概念帮助理解:

    空间距离:当前点距离滤波模板中心点的欧式距离。

    98c6d4f03dcea7e1755b3e3e367e806c.png

    灰度距离:当前点距离滤波模板中心点的灰度的差值的绝对值。

    7479453dd2fd24d14537a2e822c81408.png

    双边滤波的核函数是空间域核与像素范围域核的综合结果:

    • 1)在图像的平坦区域,像素值变化很小,那么像素差值接近于0,对应的像素范围域权重接近于1,此时空间域权重起主要作用,相当于进行高斯模糊;

    • 2)在图像的边缘区域,像素值变化很大,那么像素差值大,对应的像素范围域权重变大,即使距离远空间域权重小,加上像素域权重总的系数也较大,从而保护了边缘的信息。

    我们来看一下函数原型:

    cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) → dst

    • src:输入图像

    • d:过滤时周围每个像素领域的直径

    • sigmaColor:在color space中过滤sigma。参数越大,临近像素将会在越远的地方mix

    • sigmaSpace:在coordinate space中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大

    来看代码:

    import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("example.png")blur =  cv2.bilateralFilter(img,21,55,55)cv2.imshow("org",img)cv2.imshow("result", blur)cv2.waitKey(0)cv2.destroyAllWindows()

    先看原图:

    bac11cdc37c33d47aaa10048f169922a.png

    再看一下处理之后的图像:

    64b351d509f715bdd87152d43f8f4ae9.png

    是不是看到了一种美颜的效果,双边滤波本身就是加强对边缘信息的保留,所以轮廓什么的都会保留下来。

    OpenCV中的非线性滤波还有最大值滤波和最小值滤波,但是由于它们原理跟中值滤波一样,并且用到的很少,所以在这里就不过多讲解了。

    827ed5e011b36b398801965ebaded3ea.gif 59be6f29905d10f9a57610d631d96512.png 扫码入群 扫码添加管理员微信

    加入“电子产品世界”粉丝交流群

    ↓↓↓↓点击,查看更多新闻

    展开全文
  • I need to interpolate data coming from an instrument using a gaussian fit. To this end I thought about using the curve_fit function from scipy.Since I'd like to test this functionality on fake data be...
  • 本文我们介绍高斯过程及其在机器学习中应用的一个例子——高斯过程回归。高斯过程在语音合成中有广泛的应用,我计划在之后的文章中介绍一些应用,但本节我们重点讨论相关的基础知识。本文的大部分内容来自Stanford ...
  • python 生成高斯噪声,可设置信噪比
  • python3给数据添加高斯噪声

    千次阅读 2021-10-25 15:08:50
    高斯噪声,顾名思义是指服从高斯分布(正态分布)的一类噪声。有的时候我们需要向标准数据中加入合适的高斯噪声让数据更加符合实际。 python中的random库中集成了高斯正态分布,可以直接使用。 我们可以通过调整高斯...
  • mageFilter:Python中的图像滤波,主要对图像进行平滑、锐化、边界增强等滤波处理。图像滤波:在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响...
  • python 高斯噪声-python噪声

    千次阅读 2020-10-30 23:04:54
    广告关闭2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品。... 在本教程中,你将学习python中的白噪声时间序列。 完成本教程后,你将知道:白噪声时间序列的定义以及为什么它很重要。 如...
  • 最近学习了一下图像处理相关的知识,并用Python实现了基于KNN的验证码识别。准备工作这里我们使用opencv做图像处理,所以需要安装下面两个库pip3 install opencv-python pip3 install numpy识别原理我们采取一种有...
  • 在matlab中,存在执行直接得函数来添加高斯噪声和椒盐噪声。Python-OpenCV中虽然不存在直接得函数,但是很容易使用相关的函数来实现。代码:import numpy as npimport randomimport cv2def sp_noise(image,prob):'''...
  • 就规模问题而言,我同意Olaf的看法。最佳参数相差许多数量级。但是,缩放生成玩具数据所用的参数似乎不能解决实际应用程序的问题。^{}使用^{},它在数值上近似于雅可比矩阵,其中数值问题是由于尺度的差异而产生的...
  • 使用python实现向图片添加高斯噪声

    千次阅读 2020-11-20 15:09:42
    # sigma控制高斯噪声的比例 def noiseGauss(img,sigma): temp_img = np.float64(np.copy(img)) h = temp_img.shape[0] w = temp_img.shape[1] noise = np.random.randn(h,w) * sigma noisy_img = np.zeros(temp...
  • python图像处理(一): 添加高斯噪声核心思想代码 核心思想 先将原图片的像素值除以255,即将像素值区间[0,255]投射到[0,1],再添加服从高斯分布的噪声,最后将处理后的像素矩阵乘255恢复。 为什么不直接添加噪声呢...
  • 图片添加高斯噪声和椒盐噪声python

    千次阅读 2022-01-24 23:14:27
    使用Python给图片添加高斯噪声和椒盐噪声,在研究图像降噪算法时,经常会使用到,简单的写了几行代码。 import cv2 import os import numpy as np def Expand2Dto3D(img): img = np.expand_dims(img, axis=2) ...
  • 在前面的numpy的学习中忽略了这几个重要的知识点,导致今天做作业异常的艰难。...一维的,二维的等等),还可以产生正态分布的数(既可以用它来产生 扰动或者是高斯噪声 )。(1) numpy.random. rand ( d0 , ...
  • 高斯噪声,是指服从高斯分布(正态分布)的一类噪声,通常是因为不良照明和高温引起的传感器噪声,如下图:左上角第一个图是原图,其余图片分别是参数sigma取不同值时的图片:这是其噪声图片可视化:椒盐噪声,也称为脉冲...
  • 1、什么是噪声? 我的一个初中同学,说他成绩差的原因是家里没有好的学习环境。他爸爸经常招呼一帮人在家喝酒,说笑声、唱歌声,让他很烦。更可恶的是那帮人互相吹捧和自我吹捧得异常陶醉,这些人的噪声让他无法忍受...
  • python给数据加上高斯噪声

    万次阅读 多人点赞 2019-06-27 16:49:08
    python给数据加上高斯噪声1. 回顾MATLAB中的加高斯噪声2. Python中利用numpy给数据加噪声 一开始用MATLAB给数据加噪声很简单,就一句话: % 给数据加指定SNR的高斯噪声 signal_noise = awgn(signal,SNR,'measured'...
  • 高斯噪声 高斯噪声是指高绿密度函数服从高斯分布的一类噪声。特别的,假设一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称这个噪声为高斯白噪声。 高斯模糊 原理:是把要模糊的像素色值...
  • python添加高斯噪声

    万次阅读 2019-05-11 11:07:06
    import cv2 import os import glob import skimage import numpy as np def add_gaussian_noise(image_in, noise_sigma): temp_image = np.float64(np.copy(image_in)) h = temp_image.shape[0] ...
  • 高斯噪声与白高斯噪声有何不同? 在我阅读高斯噪声时,PDF具有正态分布。 白高斯噪声也有吗?如何使用Python手动(没有内置函数)为图像生成每种噪声? 我需要考虑哪些参数?让我们从头开始研究短语"白色高斯噪声"。...
  • 首首先我们先来看下python中shape()函数的用法 from numpy import *a=array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])a.shape[0] 得到a的行数为 4 然后输入a.shape[1] 得到a的列数为 3 图1:运行在python的IDLE中...
  • [work] python 向数据中添加高斯噪声

    万次阅读 2018-09-28 14:11:19
    什么是高斯噪声 高斯噪声既是符合高斯正态分布的误差。一些情况下我们需要向标准数据中加入合适的高斯噪声会让数据变得有一定误差而具有实验价值。高斯噪声还有一些其他用途但是我不太了解,这里我是为了实现多项式...
  • python+OpenCv笔记(八):图像噪声(椒盐噪声、高斯噪声
  • 目录 1、高斯噪声 2、椒盐噪声 3、模糊操作 1、高斯噪声 顾名思义指服从高斯分布(正态分布)的一类噪声,通常是因为不良照明和温度引起的传感器噪声。通常在RGB图像中,显现比较明显。如图: 高斯噪声+模糊/高斯...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,700
精华内容 4,680
关键字:

python高斯噪声