OpenCV画像処理 ---- 画像二値化

图像二值化( Image Binarization)画像上のピクセルのグレースケール値を 0 または 255 に設定することで、画像全体に明らかな白黒効果を与える処理です。


二値化の原理

import cv2

img = cv2.imread('img/lena.jpg')
# 转为灰度图
new_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
height, width = new_img.shape[0:2]

# 设置阈值
thresh = 60

# 遍历每一个像素点
for row in range(height):
    for col in range(width):
        # 获取到灰度值
        gray = new_img[row, col]
        # 如果灰度值高于阈值 就等于255最大值
        if gray > thresh:
            new_img[row, col] = 255
        # 如果小于阈值,就直接改为0
        elif gray < thresh:
            new_img[row, col] = 0

cv2.imshow('img', new_img)
cv2.waitKey()

ここに画像の説明を挿入


OpenCVが提供する画像二値化API

threshold()方法参数:

  1. 画像マトリックス
  2. しきい値
  3. 写真の最大値
  4. 二値化法

二値化の方法:

THRESH_BINARY しきい値を超えると 255 に変更され、しきい値を下回ると 0 に変更されます。
THRESH_BINARY_INV しきい値を超えると 0 に変更され、しきい値を下回ると 255 に変更されます。
THRESH_TRUNC 切り捨て、しきい値を超えてしきい値に変更、最大無効化
THRESH_TOZERO 閾値を超えると変化せず、閾値を下回ると0に変化します。
THRESH_TOZERO_INV 閾値より高ければ0、閾値より低ければ変化しない
import cv2

img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE)

thresh, new_img = cv2.threshold(img, 60, 255, cv2.THRESH_BINARY)

print(thresh)
cv2.imshow('img', img)
cv2.imshow('NEW_IMG', new_img)
cv2.waitKey()

ここに画像の説明を挿入


適応閾値

しきい値としてグローバル値を使用します。しかし、これはすべての場合に良いとは限りません。画像の領域ごとに照明条件が異なる場合。この場合、適応しきい値処理が役に立ちます。ここで、アルゴリズムは、ピクセルの周囲の小さな領域に基づいてピクセルをしきい値に設定します。したがって、同じ画像の異なる領域に対して異なるしきい値が得られ、異なる照明の画像に対してより良い結果が得られます。

adaptlive()方法参数:

  1. 画像マトリックス
  2. 画像の最大グレースケール
  3. 閾値の計算方法
  4. しきい値の種類
  5. 処理ブロックサイズ
  6. アルゴリズムで使用される定数 C
  • cv2.ADAPTIVE_THRESH_MEAN_C: しきい値は、近傍から減算された定数平均 C です。
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C: しきい値は、近傍値のガウス加重合計から定数 C を引いたものです。
import cv2

img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE)

thresh_img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 5)

cv2.imshow('thresh_img', thresh_img)
cv2.waitKey()

ここに画像の説明を挿入

大津アルゴリズム(クラス間最大分散法)

图像分割中阈值选取的最佳算法

threshold(gaussian_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

import cv2

img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE)

# 使用255的阈值进行二值化
ret, thresh_img = cv2.threshold(img, 255, 255, cv2.THRESH_BINARY)
cv2.imshow('normal', thresh_img)

# 使用高斯滤波模糊图像  参数1: 图片矩阵  参数2:卷积核 参数3: 越大越模糊
gaussian_img = cv2.GaussianBlur(img, (5, 5), 0)
cv2.imshow('gaussian_img', gaussian_img)

# 使用大津算法0阈值二值化经过高斯滤波模糊后的图像
ret, thresh_img = cv2.threshold(gaussian_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

cv2.imshow('otsu', thresh_img)

cv2.imshow('img', img)
cv2.waitKey()

元の画像:
ここに画像の説明を挿入

2 値化にしきい値 255 を使用すると、画像はすべて黒になります。

ここに画像の説明を挿入

ガウス フィルターを使用して画像をぼかします。

  1. 画像マトリックス
  2. コンボリューションカーネル
  3. より大きく、よりぼやけた

ここに画像の説明を挿入

しきい値 0 の Otsu アルゴリズムを使用して、ガウス フィルターによってぼかされた画像を 2 値化します。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/bjsyc123456/article/details/124781982