OpenCVの-python-研究では、11(画像平滑化とフィルタリングを)ノート

2次元コンボリューション(画像フィルタ)

1次元信号のように、画像は等をフィルタリングするためのローパスフィルタ(LPF)、ハイパスフィルタ(HPF)の多様であってもよいです。LPFはノイズ、ぼやけた画像を削除するのに役立ちます。HPFフィルターは、画像のエッジを見つけるのに役立ちます。OpenCVの関数cv.filter2D()カーネルへと画像を畳み込むを提供します。例えば、我々は平均的な画像フィルタリングしようとします。5×5平均フィルタカーネルを次のように

次のようにコアがピクセル上に残っている、すべての25個の画素下のコアを加算平均し、新しい平均画素中心で置換されています。画像内の全画素について、この操作を継続し続けます。

機能

DST = cv.filter2D(SRC、ddepth、カーネル[、DST [、アンカー〔、デルタ[、borderType]]]])

パラメータ:

SRC 入力画像
DST srcと同じサイズ、出力画像のチャンネルの同じ数。
ddepth 対象画像の必要な深さ。-1原画像の深度。参照  の組み合わせを  
カーネル あなたが別の色平面に分割に画像を使用して、異なるコンボリューションカーネルの異なるチャネルを使用して、それらを別々に処理したい場合は、コンボリューションカーネル、シングルチャンネルの浮動小数点行列。                                                                          
アンカー 濾過カーネルの点の相対的位置を示すコアアンカー、アンカーがカーネル内にあるべきである;デフォルト値(-1、-1)、すなわちアンカーコアの中心を表しています。
デルタ 対象画像を記憶画素の任意の値に追加される前に、デフォルト値は0であります
borderType ボーダーの種類、参照  BorderTypes

 

例えば:

インポートNP AS numpyの
 インポートCV AS CV2
 から matplotlibのインポートPLT AS pyplot 
IMG = cv.imread(' 2.JPG ' #の畳み込みカーネル、シングルチャンネルの浮動小数点行列 
カーネル= np.ones((5,5 )、NP .float32)/ 25 
DST = cv.filter2D(IMG、-1 、カーネル)
plt.subplot( 121)、plt.imshow(IMG)、plt.title(' オリジナル' 
plt.xticks([])、PLT。 yticks([])
plt.subplot( 122)、plt.imshow(DST)、plt.title(' 平均化' 
plt.xticks([])、plt.yticks([])
plt.show()

 

 

画像ボケ(画像スムージング)

 像振れを畳み込み核を有する画像をローパスフィルタリングすることによって達成されます。ノイズを除去するのに便利です。これは効果的に(:ノイズ、エッジなどの)画像における高周波成分を削除します。この操作ではそう、エッジ少しあいまい。OpenCVのは、ファジィ技術の4つの主要なタイプが用意されています。

平均ぼかし

 正規化されたコンボリューションボックスによって実装されます。彼は畳み込み中心元素で置換する画素ブロックの面積平均をカバーする、関数であってもよいcv.blurまたは()cv.boxFilter終了。私たちは、幅と高さ畳み込みボックスを設定する必要があります。以下は、また、平均フィルタカーネルとして知られている正規化畳み込みブロック、です。

 

例えば、3×3畳み込みブロックは次のようになります。

あなたが正規化されたコンボリューションボックスを使用したくない場合は、(cv2.boxFilterを使用する必要があります)、パラメータを渡すために、この時間は= Falseを正規化します。

機能:

DST = cv.blur(SRC、ksize [、DST [、アンカー〔、borderType]]])

パラメータ:

SRC 入力画像は、それは任意の数のチャンネルを持つことができ、独立して処理されます。しかし、深さはCV_8U、CV_16U、CV_16S、CV_32FまたはCV_64Fでなければなりません。
DST 同じサイズ、同じタイプの出力画像、およびSRC
KSIZへ コンボリューションカーネルの平均サイズはx * yを行列を表すタプル(x、y)は                                                                                                           
アンカー アンカー、コアの基準点、点のデフォルト値( - 1,1)、カーネル内のアンカーの中心。
borderType ボーダーの種類、参照  BorderTypes

コール blur(src, dst, ksize, anchor, borderType)函数相当于调用 boxFilter(src, dst, src.type(), anchor, true, borderType).

ガウスぼかし

在这种情况下,用高斯核函数代替了盒形滤波器。这是通过函数cv.GaussianBlur()完成的。我们应该指定内核的宽度和高度,它们应该是正的奇数。我们还应该分别指定X和Y方向的标准差,sigmaX和sigmaY。如果只指定sigmaX,则sigmaY与sigmaX相同。如果两者都是零,那么函数会根据核函数的大小自己计算。高斯滤波可以有效的从 图像中去除高斯噪音。

函数:

dst=cv.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])使用高斯滤波器模糊图像

参数:

 

src 输入图像;图像可以有任意数量的通道,这些通道是独立处理的,但是深度应该是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
dst 与src有相同大小和类型的输出图像
ksize 高斯卷积核尺寸,元祖(x,y). ksize.width 和 ksize.height 可以是不同的 但必须是正的奇数. 或者, 它们可以为0然后由计算得到.
sigmaX 高斯核在x方向的标准差
sigmaY 高斯核在y方向的标准差(sigmaY=0时,其值自动由sigmaX确定(sigmaY=sigmaX);sigmaY=sigmaX=0时,它们的值将由ksize.width和ksize.height自动确定)                                                    
borderType 像素边界类型, see BorderTypes

 

中值模糊

就是用与卷积框对应像素的中值来替代中心像素的值。这个滤波器经常用来去除椒盐噪声。前面的滤波器都是用计算得到的一个新值来取代中 心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他。kernel size的大小也应该是一个正奇数。

函数:

dst=cv.medianBlur(src, ksize[, dst])使用中值滤波器模糊图像。

该函数使用ksize×ksize孔径的中值滤波器平滑图像。多通道图像的每个通道都是独立处理的。支持就地操作。中值过滤器在内部使用border_replication来处理边界像素,请参见BorderTypes

参数:

src 输入1-,3-,4-通道的图像; 当ksize 是 3 或 5时,图像的深度应该时 CV_8U, CV_16U, or CV_32F, 如果孔径更大, 它只可能是CV_8U.
dst 与src大小和类型相同的输出图像                                                                                                                    
ksize 孔径大小,必须是奇数且大于1, for example: 3, 5, 7 ...

 

双边滤波

cv.bilateralFilter在保持边缘清晰的同时,对噪声去除非常有效。但与其他过滤器相比,该操作速度较慢。们已经知道高斯滤波器是求 中心点邻近区域像素的高斯加权平均值。这种高斯滤波器只考虑像素之间的空间关系,而不会考虑像素值之间的关系(像素的相似度,所以这种方法不会考 虑一个像素是否位于边界。因此边界也会别模糊掉,而这并不是我们想要的。

 

双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有 与中心像素灰度值相近的才会被用来做模糊运算。所以这种方法会确保边界不 会被模糊掉,因为边界处的灰度值变化比较大。

函数:

dst=cv.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])

参数:

src 8-bit or floating-point, 1-channel or 3-channel image.
dst 与原图像具有相同大小和类型的输出图像
d 用于滤波的每个像素邻域的直径. 如果这个值是负数,则根据 sigmaSpace自动计算
sigmaColor 色空间过滤器的sigma值. 值越大 表明该像素邻域内(see sigmaSpace)更多的颜色被混合到一起,产生较大的半相等颜色区域
sigmaSpace 坐标空间中滤波器的sigma值,参数值越大,表示距离越远的像素只要颜色足够接近就会相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关,否则d正比于sigmaSpace.                           
borderType 边界类型, see BorderTypes

 

综合案例

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('4.jpg')  # 注意图片尺寸必须是卷积核的整倍,否则出错

# 2D卷积滤波
kernel = np.ones((3, 3), np.float32)/9  # 创建一个9*9的平均滤波器核
dst = cv2.filter2D(img, -1, kernel)

# 平均模糊
blur = cv2.blur(img, (5, 5))

# 高斯滤波
gauss = cv2.GaussianBlur(img, (5, 5), 0)

# 中值滤波
median = cv2.medianBlur(img, 5)

# 双边滤波
bila = cv2.bilateralFilter(img, 10, 200, 200)

plt.subplot(231), plt.imshow(img), plt.title('Original')
plt.subplot(232), plt.imshow(dst), plt.title('Filter2D')
plt.subplot(233), plt.imshow(blur), plt.title('Averaging')
plt.subplot(234), plt.imshow(gauss), plt.title('GuassianBlur')
plt.subplot(235), plt.imshow(median), plt.title('MedianBlur')
plt.subplot(236), plt.imshow(bila), plt.title('BilateralFilter " 

plt.show()

 

おすすめ

転載: www.cnblogs.com/blog-xyy/p/11260486.html