opencv中文文档

opencv中文文档


滤波图像

<h1>目标</h1> <p>学会:</p> <ul> <li>用各种低通滤波器模糊图像</li> <li>应用自定义滤波器到图像(2D卷积)</li> </ul> <h1>2D卷积(图像滤波)</h1> <p>与一维信号一样,图像也可以用各种低通滤波器(LPF)、高通滤波器(HPF)等进行滤波。LPF有助于去除噪声,模糊图像等。HPF过滤器有助于在图像中找到边缘。</p> <p>OpenCV提供了一个函数cv.filter2D()来将内核与图像进行卷积。例如,我们将尝试对图像进行平均滤波。一个5x5平均滤波内核如下:</p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/acba333158cf1ea28af4f0c8f52f4193?showdoc=.jpg" alt="" /></p> <p>操作如下:将该内核保持在一个像素之上,将该内核之下的所有25个像素相加,取其平均值,然后用新的平均值替换中心像素。它将对图像中的所有像素继续此操作。试试这个代码,并检查结果:</p> <pre><code class="language-python">import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('opencv_logo.png') kernel = np.ones((5,5),np.float32)/25 dst = cv.filter2D(img,-1,kernel) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(dst),plt.title('Averaging') plt.xticks([]), plt.yticks([]) plt.show()</code></pre> <p>结果: <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/8de414a04b202c2b7cf2881116d41815?showdoc=.jpg" alt="" /></p> <h1>图像模糊(图像平滑)</h1> <p>图像模糊是通过将图像与低通滤波核进行卷积来实现的。它对消除噪音很有用。它实际上删除了图像中的高频内容(如:噪声、边缘)。在这个操作中,边缘有点模糊。(当然,也有一些模糊技术不会模糊边缘)。OpenCV主要提供四种类型的模糊技术</p> <h3>1. 求平均值</h3> <p>这是通过将图像与规范化的框过滤器进行卷积来实现的。它只是取内核区域下所有像素的平均值并替换中心元素。这是由函数cv.blur()或cv.boxFilter()完成的。有关内核的更多细节,请查看文档。我们应该指定内核的宽度和高度。一个3x3归一化的框式滤波器应该如下图所示:</p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/fcdd73224bfa3ab1663f39a3c47d7dfb?showdoc=.jpg" alt="" /></p> <pre><code>如果不希望使用规格化的box filter,请使用cv.boxFilter()。向函数传递一个参数normalize=False。</code></pre> <p>检查下面的示例演示,内核大小为5x5:</p> <pre><code class="language-python">import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('opencv-logo-white.png') blur = cv.blur(img,(5,5)) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Blurred') plt.xticks([]), plt.yticks([]) plt.show()</code></pre> <p>结果: <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/119eec54e9060e85b7c7e4cfe3ad537e?showdoc=.jpg" alt="" /></p> <h3>2. 高斯模糊</h3> <p>在这种情况下,用高斯核函数代替了盒形滤波器。这是通过函数cv.GaussianBlur()完成的。我们应该指定内核的宽度和高度,它们应该是正的和奇数的。我们还应该分别指定X和Y方向的标准差,sigmaX和sigmaY。如果只指定sigmaX,则sigmaY与sigmaX相同。如果两者都是零,则从内核大小计算它们。高斯模糊是消除图像中高斯噪声的有效方法。</p> <p>你可以用cv.getGaussianKernel()创建一个高斯核函数</p> <p>以下代码可以修改为高斯模糊:</p> <pre><code class="language-python">blur = cv.GaussianBlur(img,(5,5),0)</code></pre> <p>结果:</p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/6a11154ecaf0e76da5991e2f79d70f4e?showdoc=.jpg" alt="" /></p> <h3>3.模糊中值</h3> <p>函数cv.medianBlur()取内核区域下所有像素的中值,然后用这个中值替换中心元素。这是非常有效的对图像中的盐和胡椒噪声。有趣的是,在上面的过滤器中,中心元素是一个新计算的值,它可以是图像中的像素值,也可以是一个新值。但是在中值模糊中,中心元素总是被图像中的某个像素值所替代。有效降低噪音。它的内核大小应该是一个正奇数。</p> <p>在这个演示中,我为原始图像添加了50%的噪声,并应用了中值模糊。检查结果:</p> <pre><code class="language-python">median = cv.medianBlur(img,5)</code></pre> <p>结果: <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/176a88ba3843781aec1b715b3d9f874a?showdoc=.jpg" alt="" /></p> <h3>4.双边滤波</h3> <p>cv.bilateralfilter()在保持边缘锋利的同时,对噪声去除非常有效。但与其他过滤器相比,该操作速度较慢。我们已经看到高斯滤波器取像素周围的a邻域并求其高斯加权平均。这个高斯滤波器是一个单独的空间函数,即在滤波时考虑附近的像素。它不考虑像素是否具有几乎相同的强度。它不考虑像素是否是边缘像素。它也模糊了边缘,这是我们不想做的。</p> <p>双边滤波器在空间上也采用高斯滤波器,但多了一个高斯滤波器,它是像素差的函数。空间高斯函数确保只考虑附近像素的模糊,而强度差高斯函数确保只考虑与中心像素强度相似的像素的模糊。所以它保留了边缘,因为边缘上的像素会有很大的强度变化。</p> <p>下面的示例显示使用双边过滤器(有关参数的详细信息,请访问文档)。</p> <pre><code class="language-python">blur = cv.bilateralFilter(img,9,75,75)</code></pre> <p>结果: <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/f4e0400cb80ecd9411fd004627763603?showdoc=.jpg" alt="" /></p> <p>看,表面的纹理消失了,但边缘仍然保留。</p> <h1>其他资源</h1> <p><a href="http://people.csail.mit.edu/sparis/bf_course/" title="关于双边滤波的细节">关于双边滤波的细节</a></p>

页面列表

ITEM_HTML