はじめに
IOSアプリ開発でOpen cvをインストールして画像の二値化処理を行ったので、私がより理解するため簡単に分かったことを記事引用しながら纏めてみる
※あくまでも簡単に
以下記事で画像を二値化する為にSwiftへOpen cvをインストールから二値化までを簡単に纏めてます。
それでは上記記事でのコードを使いつつ纏めていきます。
二値化ってそもそも何?
言葉のままですが、画像の色を【白】と【黒】のみにすること。
iPhoneのカメラなどで撮影すると次の画像のように色付きで写真が撮影される。
私はまだ画像処理を多用した事がないので明確に体感した事はないのですが、画像処理する理由としては次のようになります。
・色情報が入ってる為、画像処理を行う際にサイズが大きくなり処理速度への影響がある。
・ノイズ等もあり適切な画像処理や認識ができないらしいです。
以下GPT君に聞いてみた結果です。いやぁ優秀で分かりやすい。
実際に二値化してみる。
今回はSwiftへ埋め込んでいるのでobject-c++で書いてます。
全コードは最初に記載した記事へ飛んでもらうと、見ることができる。
#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>
#import "OpenCVSample.h"
@implementation OpenCVSample
+(UIImage *)GrayScale:(UIImage *)image{
// convert image to mat
cv::Mat mat;
UIImageToMat(image, mat);
// convert mat to gray scale
cv::Mat gray;
cv::cvtColor(mat, gray, cv::COLOR_BGR2GRAY);
//2値化処理
cv::Mat binary;
cv::threshold(gray, binary, 110, 255, cv::THRESH_BINARY);
// swift側で使用する用画像をUIImageで作成
UIImage * grayImg = MatToUIImage(binary);
return grayImg;
}
@end
撮影時の画像はいつ撮ったか覚えてないのでUIが違ったり微妙に画像違うのは無視してください。
以下部分で二値化をしているが、この部分のtypeについて書いてみる
cv::threshold(gray, binary, 110, 255, cv::THRESH_BINARY);
【cv::threshold】で二値化の命令が出来る。
第4引数までは割愛するとして第五引数で二値化を行うtype指定が可能。
以下公式ドキュメント
type | 説明 |
---|---|
cv2.THRESH_BINARY | 画素の輝度値が閾値を超える場合は maxval、そうでない場合は 0 に設定。 |
cv2.THRESH_BINARY_INV | 画素の輝度値が閾値を超える場合は 0、そうでない場合は maxval に設定。 |
cv2.THRESH_TRUNC | 画素の輝度値が閾値を超える場合は閾値に、そうでない場合はそのままの値に設定。 |
cv2.THRESH_TOZERO | 画素の輝度値が閾値を超える場合はそのままの値に、そうでない場合は 0 に設定。 |
cv2.THRESH_TOZERO_INV | 画素の輝度値が閾値を超える場合は 0 に、そうでない場合はそのままの値に設定 |
cv2.THRESH_OTSU | 大津の二値化。画像のヒストグラム解析を用いて自動的に閾値を決定する手法です |
cv2.THRESH_TRIANGLE | トライアングル アルゴリズムにより自動的に閾値を決定する手法です。 |
大津の二値化記事があったので参考までに
簡単にいうと、閾値探すの大変だけど大津の閾値使えば楽!