openCV
前回、openCVで画像のリサイズ、トリミング、回転、反転のやり方を紹介しました。
今回は画像の二極化を試してみます。
今回も使う画像はこちらの蓮の花(lotus.jpg)を使っていきます。
それでは始めていきましょう。
cv2.THRESH_BINARY
二極化の方法はいくつかあるのですが、まずは値が閾値を超えたら全て同じ値にして、閾値より下回ったところは0にする「cv2.THRESH_BINARY」を試してみます。
その場合は「cv2.threshold(画像, 閾値, 閾値を超えた場合に変更する値, cv2.THRESH_BINARY)」とします。
また閾値と画像の2つが返ってくるので、2つの変数に格納します。
import cv2
img = cv2.imread("lotus.jpg")
ret, img_thresh = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
print(ret)
cv2.imwrite("lotus4-2.jpg", img_thresh)
実行結果
128.0
モノクロの画像にしたい場合は、まず画像をグレースケールにしてから、cv2.thresholdを行います。
import cv2
img = cv2.imread("lotus.jpg", cv2.IMREAD_GRAYSCALE)
ret, img_thresh = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
print(ret)
cv2.imwrite("lotus4-3.jpg", img_thresh)
実行結果
128.0
閾値を下げてみるとこんな感じに変わります。
import cv2
img = cv2.imread("lotus.jpg")
ret, img_thresh = cv2.threshold(img, 64, 255, cv2.THRESH_BINARY)
print(ret)
cv2.imwrite("lotus4-4.jpg", img_thresh)
実行結果
64.0
閾値を超えた場合に変更する値を下げてみるとこんな感じに変わります。
import cv2
img = cv2.imread("lotus.jpg")
ret, img_thresh = cv2.threshold(img, 128, 128, cv2.THRESH_BINARY)
print(ret)
cv2.imwrite("lotus4-5.jpg", img_thresh)
実行結果
128.0
cv2.THRESH_BINARY_INV
次に閾値より値が下回った際に全て同じ値にして、上回った場合は0にする「cv2.THRESH_BINARY_INV」です。
その場合は、「cv2.threshold(画像, 閾値, 閾値を超えた場合に変更する値, cv2.THRESH_BINARY_INV)」とします。
import cv2
img = cv2.imread("lotus.jpg")
ret, img_thresh = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY_INV)
print(ret)
cv2.imwrite("lotus4-6.jpg", img_thresh)
実行結果
128.0
cv2.THRESH_TRUNC
これまでは閾値を上回った場合、もしくは下回った場合に設定した値となり、その逆の値は0になっていました。
次の「cv2.THRESH_TRUNC」では、閾値を上回った場合は設定した値に、下回った部分はそのままにします。
「cv2.threshold(画像, 閾値, 閾値を超えた場合に変更する値, cv2.THRESH_TRUNC)」とします。
import cv2
img = cv2.imread("lotus.jpg")
ret, img_thresh = cv2.threshold(img, 128, 255, cv2.THRESH_TRUNC)
print(ret)
cv2.imwrite("lotus4-7.jpg", img_thresh)
実行結果
128.0
cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV
閾値以下のところを全て0にし、閾値以上のところはそのままにするには「cv2.THRESH_TOZERO」を使います。
その場合は「cv2.threshold(画像, 閾値, 閾値を超えた場合に変更する値, cv2.THRESH_TOZERO)」とします。
import cv2
img = cv2.imread("lotus.jpg")
ret, img_thresh = cv2.threshold(img, 128, 255, cv2.THRESH_TOZERO)
print(ret)
cv2.imwrite("lotus4-8.jpg", img_thresh)
実行結果
128.0
逆に閾値以上のところを0にし、それ以下のところをそのままにするには「cv2.THRESH_TOZERO_INV」を使います。
その場合は「cv2.threshold(画像, 閾値, 閾値を超えた場合に変更する値, cv2.THRESH_TOZERO_INV)」とします。
import cv2
img = cv2.imread("lotus.jpg")
ret, img_thresh = cv2.threshold(img, 128, 255, cv2.THRESH_TOZERO_INV)
print(ret)
cv2.imwrite("lotus4-9.jpg", img_thresh)
実行結果
128.0
cv2.THRESH_OTSU
閾値を自動で決めるには「cv2.THRESH_OTSU」と「cv2.THRESH_TRIANGLE」という2つの手法があります。
ただしどちらもグレースケールの画像にしか使えないことに注意です。
「cv2.THRESH_OTSU」の場合は「cv2.threshold(画像, 閾値, 閾値を超えた場合に変更する値, cv2.THRESH_TOZERO_INV)」としますが、「閾値」と「 閾値を超えた場合に変更する値」を設定しますが使われません。
import cv2
img = cv2.imread("lotus.jpg", cv2.IMREAD_GRAYSCALE)
ret, img_thresh = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)
print(ret)
cv2.imwrite("lotus4-10.jpg", img_thresh)
実行結果
96.0
cv2.THRESH_TRIANGLE
「cv2.THRESH_TRIANGLE」の場合は「cv2.threshold(画像, 閾値, 閾値を超えた場合に変更する値, cv2.THRESH_TRIANGLE)」とします。
こちらの場合も「閾値」と「 閾値を超えた場合に変更する値」を設定しますが使われません。
import cv2
img = cv2.imread("lotus.jpg", cv2.IMREAD_GRAYSCALE)
ret, img_thresh = cv2.threshold(img, 0, 255, cv2.THRESH_TRIANGLE)
print(ret)
cv2.imwrite("lotus4-11.jpg", img_thresh)
実行結果
40.0
次回はopenCVで色のヒストグラムを表示する方法を紹介します。
ではでは今回はこんな感じで。
コメント