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()