Opencv3 C ++ VS2017スタディノート09モルフォロジー操作アプリケーション

  • AdaptiveThreshold(〜gray、bin、255、ADAPTIVE_THRESH_MEAN_C、THRESH_BINARY、15、-2);
    • 適応しきい値処理、ここでは2値化のみが使用されます
    • 灰色を反転する必要があることに注意してください。ここでは、背景色を参照する必要があります。白い背景を使用したので、バイナリイメージが黒い背景になるように反転する必要があります。
    • パラメータ:元の画像、出力画像、2値化アルゴリズム、しきい値タイプ(エンタングルする必要はありません)、操作ブロックサイズ(adaptiveThresholdの計算単位はピクセルの近傍ブロックであり、近傍ブロックのサイズはこの値によって決定されます) 、バイアスシフト調整量(±、0ともに可能)
    • 15は近隣ブロックのサイズです。適応型二値化が不十分であることが判明した場合は、それとオフセット-2を調整できます。
  • 水平線を保つ
    • AdaptiveThreshold(〜gray、bin、255、ADAPTIVE_THRESH_MEAN_C、THRESH_BINARY、3、-2);
    • Mat hline = getStructuringElement(MORPH_RECT、Size(src0.cols / 15、1)、Point(-1、-1));
  • 垂直線を維持する
    • AdaptiveThreshold(〜gray、bin、255、ADAPTIVE_THRESH_MEAN_C、THRESH_BINARY、3、-2);
    • Mat vline = getStructuringElement(MORPH_RECT、Size(1、src0.rows / 15)、Point(-1、-1));
  • 手紙を保管してください
    • AdaptiveThreshold(〜gray、bin、255、ADAPTIVE_THRESH_MEAN_C、THRESH_BINARY、13、-2);
    • マットカーネル= getStructuringElement(MORPH_RECT、Size(4,4)、Point(-1、-1));
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>

using namespace std;
using namespace cv;

Mat src0, gray, bin, dst;
int main(int argc, char ** argv)
{
	src0 = imread("C:\\Users\\xujin\\Desktop\\ABCD.PNG");
	if (!src0.data)
	{
		cout << "no image";
		return -1;
	}
	namedWindow("src0_image", WINDOW_AUTOSIZE);
	imshow("src0_image", src0);
	cvtColor(src0, gray, COLOR_BGR2GRAY);
	namedWindow("gray_image", WINDOW_AUTOSIZE);
	namedWindow("bin_image", WINDOW_AUTOSIZE);
	imshow("gray_image", gray);

	//二值化
	adaptiveThreshold(~gray, bin, 255,	ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 13,-2);
	//注意gray要取反,这里要参考我们的背景颜色, 我用的是白色背景,所以要取反这样二值图片就是黑色背景
	imshow("bin_image", bin);
	//保留水平线
	Mat hline = getStructuringElement(MORPH_RECT, Size(src0.cols / 15, 1), Point(-1, -1));
	//保留垂直线
	Mat vline = getStructuringElement(MORPH_RECT, Size(1, src0.rows/15), Point(-1, -1));
	//保留字母
	Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3), Point(-1, -1));
	//这里主要是靠kernel的size来抹除细小噪声, 因为噪点比字母要小很多,所以可以靠小的kernel进行抹除

	Mat temp;
	erode(bin, temp, kernel, Point(-1, -1));
	dilate(temp, dst, kernel, Point(-1, -1));

	//erode(bin, temp, vline, Point(-1, -1));
	//dilate(temp, dst, vline, Point(-1, -1));

	namedWindow("dst_image", WINDOW_AUTOSIZE);
	imshow("dst_image", dst);
	waitKey(0);
	return 0;
}

 

おすすめ

転載: blog.csdn.net/Mrsherlock_/article/details/104514674