图像二值化( 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()方法参数:
- 画像マトリックス
- しきい値
- 写真の最大値
- 二値化法
二値化の方法:
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()方法参数:
- 画像マトリックス
- 画像の最大グレースケール
- 閾値の計算方法
- しきい値の種類
- 処理ブロックサイズ
- アルゴリズムで使用される定数 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 を使用すると、画像はすべて黒になります。
ガウス フィルターを使用して画像をぼかします。
- 画像マトリックス
- コンボリューションカーネル
- より大きく、よりぼやけた
しきい値 0 の Otsu アルゴリズムを使用して、ガウス フィルターによってぼかされた画像を 2 値化します。