OpenCV学習の基本的な画像操作(7):水平および水平線の抽出、背景への検証コード

PS:この記事では、2つの小さなケースを使用して、画像処理における形態学的操作の適用を示します。

写真の水平線と水線を抽出します

AIPの紹介

適応しきい値セグメンテーション

void adaptiveThreshold(InputArray src, OutputArray dst,  
                        double maxValue, int adaptiveMethod,  
                       int thresholdType, int bolckSize, double C)  

パラメータ1:InputArrayタイプsrc、入力イメージ、単一チャネルの入力、単一の8ビット浮動小数点タイプMat。
パラメータ2:関数操作の結果がここに保存されます。これは出力画像です(入力画像と同じサイズとタイプ)。
パラメータ3:条件を満たす最大値をプリセットします。通常の画像は255です。
パラメータ4:適応しきい値アルゴリズムを指定します。ADAPTIVE_THRESH_MEAN_CまたはADAPTIVE_THRESH_GAUSSIAN_Cを選択できます。
パラメータ5:しきい値タイプを指定します。THRESH_BINARYまたはTHRESH_BINARY_INVを選択できます。(つまり、バイナリしきい値または逆バイナリしきい値)。
パラメータ6:エリアしきい値の計算に使用される近傍ブロックのサイズを示し、奇数が選択されています。
パラメータ7:パラメータCは、アルゴリズムに関連するパラメータを表します。これは、平均または加重平均から抽出された定数であり、負の数にすることができます。

 

ADAPTIVE_THRESH_MEAN_Cは、ローカルネイバーフッドブロックの平均値です。アルゴリズムは、最初にブロック内の平均値を見つけてから、定数Cを減算します。

ADAPTIVE_THRESH_GAUSSIAN_Cは、ローカル近傍ブロックのガウス加重和です。アルゴリズムは、中心点からの距離に応じてガウス関数に従って領域内の(x、y)の周りのピクセルに重みを付け、定数Cを減算します。

プロセスとアイデア

  • 最初に画像をグレースケールに変換します

  • 適応しきい値セグメンテーションを使用して、画像を2対画像に処理します(注:前景が背景よりも暗い場合は、前景処理に閉じた操作を使用します。前景が背景よりも明るい場合は、前景処理に開いた操作を使用します)。

  • 設計計算コアは、水平および垂直の接続線を抽出するために使用されます。
    • 水平線と水平線を抽出する場合、コアの形状はSize(5,1)である必要があります。垂直線を抽出する場合、コアの形状はSize(1,5)である必要があります。要するに、抽出される方向では、コアは他の方向よりも大きくなければなりません。
    • 抽出方向では、コアのスパンが大きいほど、抽出の度合いが高くなります。つまり、この方向の接続の度合いを高く抽出する必要があります。
    • 非抽出方向では、「1」に設定して、他の方向の接続が抽出方向の干渉からブロックされるようにします。

コードと練習

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
	//src = imread("src.jpg");
	Mat src = imread("1.PNG");
	if (!src.data)
	{
		cout << "cannot open image" << endl;
		return -1;
	}
	namedWindow("input image", WINDOW_AUTOSIZE);
	imshow("input image",src);
	
	Mat gray;
	cvtColor(src,gray ,COLOR_BGR2GRAY);
	imshow("gray", gray);
	adaptiveThreshold(gray, gray, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 10);
	imshow("bineray", gray);
	
	Mat Hline = getStructuringElement(MORPH_RECT, Size(1, 5), Point(-1, -1));
	Mat Vline = getStructuringElement(MORPH_RECT, Size(5, 1), Point(-1, -1));
	Mat H_res, V_res;

	morphologyEx(gray,H_res,MORPH_CLOSE,Hline);
	morphologyEx(gray,V_res,MORPH_CLOSE,Vline);

	imshow("H-res", H_res);
	imshow("V-res", V_res);

	waitKey(0);
	return 0;
}

キャプチャ画像の背景干渉を削除します

プロセスとアイデア(上記の例を参照)

  • 最初に画像をグレースケールに変換します
  • 適応しきい値セグメンテーションを使用して、画像を2対画像に処理します(注:前景が背景よりも暗い場合は、前景処理に閉じた操作を使用します。前景が背景よりも明るい場合は、前景処理に開いた操作を使用します)。
  • ノイズのサイズに応じてコンピューティングコアのサイズを調整します。これにより、バックグラウンド干渉を除去できますが、文字の接続は維持されます。一般に、コアサイズのアスペクト比は検証コードイメージのアスペクト比と同じです。それ以外の場合は、実際の状況に応じて調整して、文字の接続性を維持しながらコンピューティングコアをできるだけ大きくし、ノイズが大きいほどフィルタリングを強化する必要があります。

コードと練習

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
	
	Mat src = imread("chars.png");
	if (!src.data)
	{
		cout << "cannot open image" << endl;
		return -1;
	}
	namedWindow("input image", WINDOW_AUTOSIZE);
	imshow("input image",src);
	
	Mat gray;
	cvtColor(src,gray ,COLOR_BGR2GRAY);
	imshow("gray", gray);
	adaptiveThreshold(gray, gray, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 10);
	imshow("bineray", gray);
	
	Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 5), Point(-1, -1));
        //改变核在总想和横向的范围,来保证字符的连通性
	Mat Result;
	morphologyEx(gray,Result,MORPH_CLOSE,Kernel);

	imshow("Result", Result);

	waitKey(0);
	return 0;
}

おすすめ

転載: blog.csdn.net/fan1102958151/article/details/107092562