OpenCV Python (4) 画像の前処理: 2 値化 && フィルタリング操作

1.二値化

2値化とは、元の画像の画素値を閾値によって0または255に設定し、最終的に画素値が0または255の1次元画像を取得することを指します。通常、取得した画像や色空間変換後の画像はすべて 3 チャンネルの画像ですが、二値化することで無駄な情報をほとんど取り除き、黒 0または255 に分割しながら必要な情報を残すことができます。3 チャネルの画像を 1 チャネルの画像に次元削減することで、無駄な情報をほとんど削除し、計算量を削減できます二値化は画像処理でよく使われる画像の前処理方法で、一般的な二値化方法は次の 2 つです。

1. グレースケール画像の二値化

(1)、閾値関数

以下は、opencv-python が提供するグレースケール画像の 2 値化関数です。

t,img_bin = cv2.threshold(img,thresh,maxval,type)	#二值化,阈值设置
'''
其中t为阈值,img_bin为输出图; img为输入图像,thresh为阈值,maxval为最大值,
type为模式,如下所示:
cv2.THRESH_BINARY	#大于阈值的部分取最大值,小于等于阈值的部分取0
cv2.THRESH_BINARY_INV	#大于阈值的部分取0,小于等于阈值的部分取最大值
cv2.THRESH_TOZERO	#大于阈值的部分不变,小于等于阈值的部分取0
cv2.THRESH_TOZERO_INV	#大于阈值的部分取0,小于等于阈值的部分不变
cv2.THRESH_TRUNC	#大于阈值的部分取阈值,小于等于阈值的部分不变
'''

(2)の場合

プログラムは次のようになります。

import cv2  # 导入opencv库

if __name__ == '__main__':
    while True:
        img_g = cv2.imread('img/6.jpg', 0)    # 获取路径img/0.jpg的图像,图像类型为RGB图像

        t, img_bin = cv2.threshold(img_g, 180, 255, cv2.THRESH_BINARY)  # 二值化

        cv2.imshow("img_g", img_g)  # 显示RGB图像
        cv2.imshow("img_bin", img_bin)  # 显示二值化图像

        cv2.waitKey(1)  # 等待时间

効果は次のとおりです。
ここに画像の説明を挿入

2. HSV画像の二値化

opencv-pythonが提供するHSV画像二値化関数は以下のとおりです。

img_bin = cv2.inRange(img_hsv, lower, upper)	#低于lower、高于upper为0,中间为255

HSV 画像の 2 値化は第 3 回の記事で紹介されており、色認識の部分でも事例があります: OpenCV Python (3) [画像前処理: 色空間変換] && 色認識
その効果は次の図に示されています。
ここに画像の説明を挿入

2. フィルタリング操作

フィルタリングは画像の前処理とノイズ低減に不可欠な部分であり、元の画像の主な特徴に影響を与えることなくノイズの大部分を除去でき、その後の画質を決定し、その後の画像処理の複雑さを大幅に軽減します

1. 平均値フィルタリング

平均値フィルタリングは線形フィルタリングです. 平均値フィルタリングの原理は,周囲のピクセルの平均値を中点の値とすることです. エッジ点の場合, 周囲にピクセルがあるという状況を満足できません.カーネル内の残りのピクセルが使用され、ポイントはこのエッジ ピクセルの値として平均化されますただし、画像全体を走査した後、画像は非常にぼやけるため、平均フィルタリング方法では画像の元の特徴があまりにも多く失われる可能性があります。
cv2.blur は、次のように、opencv-python によって提供される平均フィルター関数です。

img_blur = cv2.blur(img, (x, x))		# 均值滤波

2.メディアンフィルタリング

メディアン フィルタリングの原理は、座標にエッジ ポイントが含まれていないことを指定し、カーネル内のすべての数値の中央値を中間点の値として取得することです (ここでのエッジ ポイントの処理は単なる方法であり、実際の値を表すものではありません)。 OpenCVが提供する機能で使用される方法の他、ミラーリングという方法や、カーネル内の残りのピクセルをすべて使用して平均値フィルタリングと同様にメディアンフィルタリングを行う方法もあります
opencv-python の cv2.medianBlur によって提供されるメディアン フィルター関数は次のとおりです。

cv2.medianBlur(img, x)			# 中值滤波

3. ガウスフィルター

ガウス フィルタリングを使用して、最初に奇数のカーネルを確認します (奇数×奇数のカーネルのみが中心点を持ち、これはガウスの原理によって満たされる必要がある条件であるため、このカーネルのサイズは奇数である必要があります) filtering ) を実行した場合、奇数番号のカーネルでない場合は、直接エラーが報告されます。

cv2.error: (-215:Assertion failed) ksize.width > 0 && ksize.width % 2 == 1 && ksize.height > 0 && ksize.height % 2 == 1 in function 'cv::createGaussianKernels'

ガウス フィルタリングの原理は、ガウス カーネルと同じサイズの配列をガウス カーネルと乗算し、それらを加算することで、得られた数値が中心点の値になります
opencv-python の cv2.GaussianBlur によって提供されるガウス フィルター関数は次のとおりです。

cv2.GaussianBlur(img, (x, x), 0)	# 高斯滤波

4. ケース

具体的なコードは次のとおりです。

import cv2  # 导入opencv库

if __name__ == '__main__':
    while True:
        img_g = cv2.imread('img/6.jpg', 0)    # 获取路径img/0.jpg的图像,图像类型为RGB图像
        img_g = cv2.resize(img_g, (0, 0), fx=0.5, fy=0.5)  # 改变图像shape

        img_blur = cv2.blur(img_g, (5, 5))  # 均值滤波
        img_medianBlur = cv2.medianBlur(img_g, 5)			# 中值滤波
        img_GaussianBlur = cv2.GaussianBlur(img_g, (5, 5), 0)  # 高斯滤波

        t1, img_g_bin = cv2.threshold(img_g, 170, 255, cv2.THRESH_BINARY)  # 二值化
        t2, img_blur_bin = cv2.threshold(img_blur, 170, 255, cv2.THRESH_BINARY)  # 二值化
        t3, img_medianBlur_bin = cv2.threshold(img_medianBlur, 170, 255, cv2.THRESH_BINARY)  # 二值化
        t4, img_GaussianBlur_bin = cv2.threshold(img_GaussianBlur, 170, 255, cv2.THRESH_BINARY)  # 二值化

        cv2.imshow("img_g", img_g)  # 显示RGB图像
        cv2.imshow("img_g_bin", img_g_bin)  # 显示二值化图像
        cv2.imshow("img_blur", img_blur)    # 显示均值滤波后的图像
        cv2.imshow("img_blur_bin", img_blur_bin)    # 显示均值滤波后的二值化图像
        cv2.imshow("img_medianBlur", img_medianBlur)    # 显示中值滤波后的图像
        cv2.imshow("img_medianBlur_bin", img_medianBlur_bin)    # 显示中值滤波后的二值化图像
        cv2.imshow("img_GaussianBlur", img_GaussianBlur)    # 显示高斯滤波后的图像
        cv2.imshow("img_GaussianBlur_bin", img_GaussianBlur_bin)    # 显示高斯滤波后的二值化图像

        cv2.waitKey(1)  # 等待时间

効果は次のとおりです。フィルタリング方法の選択
ここに画像の説明を挿入
に関して、私の個人的な理解では、ガウス フィルタリングの適用性とパフォーマンスは良好であり、ガウス フィルタリングは一般的なノイズ低減要件に使用できると考えています。上図のように、大きなノイズ点を除去したい場合にはメディアンフィルタの効果が相対的に弱くなりますが、この場合は逆に中央値を取るよりも平均値を取る方が適切です。逆に、ノイズ ポイントが非常に小さい場合、メディアン フィルターは良好な効果を発揮し、元の画像に不鮮明な結果を引き起こすことはありません。それどころか、平均値フィルターは画像の多くの特徴を除去します。が明らかでない場合、または要求があまりにもぼやけた画像を含むことができない場合、平均フィルタリングは使用できません。

私は学生で現在勉強中です、この記事は私の勉強メモとも言えるものです、間違っていたらご指摘ください。

おすすめ

転載: blog.csdn.net/xztli/article/details/126175975