OpenCV3 C ++ VS2017 연구 노트 09 형태 적 연산 응용 프로그램

  • adaptiveThreshold (~ 회색, bin, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
    • 적응 형 임계 값 연산, 여기서는 이진화 만 사용됩니다.
    • 회색은 반전되어야합니다. 여기서는 배경색을 참조해야합니다. 저는 흰색 배경을 사용 했으므로 이진 이미지가 검은 색 배경이되도록 반전해야합니다.
    • 매개 변수 : 원본 이미지, 출력 이미지, 이진화 알고리즘, 임계 값 유형 (얽힐 필요 없음), 작업 블록 크기 (adaptiveThreshold의 계산 단위는 픽셀의 인접 블록이며, 인접 블록의 크기는이 값에 의해 결정됨) , 바이어스 시프트 조정 량 (± 및 0 모두 가능)
    • 15는 이웃 블록의 크기이며, 적응 이진화가 만족스럽지 않다고 판단되면이를 조정하고 오프셋 -2를 조정할 수 있습니다.
  • 수평선 유지
    • adaptiveThreshold (~ 회색, bin, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2);
    • 매트 hline = getStructuringElement (MORPH_RECT, Size (src0.cols / 15, 1), Point (-1, -1));
  • 수직선 유지
    • adaptiveThreshold (~ 회색, bin, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2);
    • 매트 vline = getStructuringElement (MORPH_RECT, Size (1, src0.rows / 15), Point (-1, -1));
  • 편지 보관
    • adaptiveThreshold (~ 회색, 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