opencv 利用投影法对图像进行分割

投影法主要思想就是记录每一行或者每一列对应想要的像素的个数,然后根据这些个数判断它是不是边界或者是想要的物体。其中像素的个数就像是一个阈值,最后可以把每一行点的个数画出来便于直观的观察。

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
//竖直投影
vector<Mat> verticalProject(Mat srcimg)
{
	
	int width_src = srcimg.cols;
	int height_src = srcimg.rows;
	vector<int> vector_num;
	for (int i = 0; i < width_src; i++)
	{
		int white_num = 0;
		for (int j = 0; j < height_src; j++)
		{
			int prePixel = srcimg.at<uchar>(j, i);
			if (prePixel == 255)
				white_num++;
			
		}
		vector_num.push_back(white_num);
	}
	//打印数组里面的内容
	cout << "Number" << vector_num.size() << endl;
	cout << "Cols" << width_src << endl;
	cout << "Rows" << height_src << endl;
	/*for (int i = 0; i < vector_num.size(); i++)
	{
		cout << vector_num[i] << endl;
	}*/
	//画出竖直投影直方图
	Mat draw_img(height_src,width_src, CV_8UC1,Scalar(0));
	for (size_t i = 0; i <width_src; i++)
	{
		line(draw_img, Point(i,height_src), Point(i,height_src-vector_num[i]), Scalar(255), 1, 8);
	}
	imshow("Draw_img", draw_img);


	//对图像进行切割
	bool num_yesorno = false;
	int start_index = 0;
	int end_index = 0;
	vector<Mat> roi_img;
	for (size_t i = 0; i < width_src; i++)
	{
		if (!num_yesorno&&vector_num[i] != 0)
		{
			num_yesorno = true;
			start_index = i;
		}
		else if (num_yesorno&&vector_num[i] == 0)
		{
			num_yesorno = false;
			end_index = i;
			Mat roi = srcimg(Range(0, height_src), Range(start_index, end_index));
			roi_img.push_back(roi);
		}
	}
	cout << "Roi size" << roi_img.size() << endl;
	return roi_img;
}
int main(int argc, char **argv)
{
	Mat src = imread("E:/picture/shuzifenge.png");
	if (src.empty())
	{
		cout << "Can not find the image..." << endl;
		system("pause");
	}
	imshow("Input image", src);
	Mat gray_img, bin_img;
	cvtColor(src, gray_img, COLOR_BGR2GRAY);
	threshold(gray_img, bin_img, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
	imshow("Bin img", bin_img);
	//读取返回值
	vector<Mat> roi_Final =verticalProject(bin_img);
	//循环显示每一个图
	for (int i = 0; i < roi_Final.size(); i++)
	{
		string k =to_string(i);
		imshow(k,roi_Final[i]);
	}
	waitKey(0);
	return 0;
}

参考:

https://blog.csdn.net/wx7788250/article/details/60139109

https://blog.csdn.net/lcalqf/article/details/71191979

猜你喜欢

转载自blog.csdn.net/xiexu911/article/details/80387610
今日推荐