C++ opencv Horizontal projection and vertical projection

55 篇文章 0 订阅
50 篇文章 1 订阅

投影简单来说就是将图像中的像素进行横向以及纵向的综合计数处理。

  • Projection is simply to count the pixels in the image horizontally and vertically.

我需要要做的就是对投影进行进一步处理,分析得到自己想要的数据以及边界线阈值。

  • What I need to do is to further process the projection and analyze it to get the data I want and the boundary threshold.

接下来要做的:

(1)在投影之前进行预处理

(2)实现局部投影统计

NEXT:

  • (1) Pretreatment before projection

    (2) Realize local projection statistics

#include "stdafx.h"
#include <opencv2/opencv.hpp>  
#include <opencv2/core/core.hpp>  
#include <iostream>  
#include <vector>  
using namespace cv;
using namespace std;


int main()
{
	//原图
	Mat srcImage = imread("1-11.jpg");
	//imshow("原图", srcImage);
	//灰度化
	cvtColor(srcImage, srcImage, CV_RGB2GRAY);
	//otsu阈值分割
	threshold(srcImage, srcImage, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);
	//imshow("二值图", srcImage);
	//计算垂直投影
	int *colheight = new int[srcImage.cols];
	//数组必须赋初值为零,否则出错。无法遍历数组。 
	memset(colheight, 0, srcImage.cols * 4);
	int value;
	for (int i = 0; i < srcImage.rows; i++)
	{
		for (int j = 0; j<srcImage.cols; j++)
		{
			value = srcImage.at<uchar>(i, j);
			if (value == 255)
			{
				colheight[j]++;
			}

		}
	}

	Mat histogramImage(srcImage.rows, srcImage.cols, CV_8UC1);
	for (int i = 0; i < srcImage.rows; i++)
	{
		for (int j = 0; j<srcImage.cols; j++)
		{
			value = 0;  //设置为黑色。  
			histogramImage.at<uchar>(i, j) = value;
		}
	}

	for (int i = 0; i < srcImage.cols; i++)
	{
		for (int j = 0; j<colheight[i]; j++)
		{
			value = 255;  //设置为白色  
			histogramImage.at<uchar>(j, i) = value;
		}
	}

	cv::namedWindow("垂直投影", CV_WINDOW_NORMAL);//创建窗口
	cvResizeWindow("垂直投影", 800, 800); //创建一个500*500大小的窗口
	imshow("垂直投影", histogramImage);
	//计算水平投影
	int *colheighttwo = new int[srcImage.rows];
	//数组必须赋初值为零,否则出错。无法遍历数组。 
	memset(colheighttwo, 0, srcImage.rows * 4);
	int valuetwo;
	for (int i = 0; i<srcImage.rows; i++)
		for (int j = 0; j<srcImage.cols; j++)
		{
			valuetwo = srcImage.at<uchar>(i, j);
			if (valuetwo == 255)
			{
				colheighttwo[i]++;
			}
		}

	Mat plantImage(srcImage.rows, srcImage.cols, CV_8UC1);  //创建一个新的mat型
															//把这个图全部画成黑色
	for (int i = 0; i < srcImage.rows; i++)
	{
		for (int j = 0; j<srcImage.cols; j++)
		{
			valuetwo = 0;  //设置为黑色。  
			plantImage.at<uchar>(i, j) = valuetwo;
		}
	}

	for (int i = 0; i < srcImage.rows; i++)
	{
		for (int j = 0; j<colheighttwo[i]; j++)
		{
			valuetwo = 255;  //设置为白色  
			plantImage.at<uchar>(i, j) = valuetwo;
		}
	}

	cv::namedWindow("水平投影", CV_WINDOW_NORMAL);//创建窗口
	cvResizeWindow("水平投影", 800, 800); //创建一个500*500大小的窗口
	imshow("水平投影", plantImage);
	waitKey(0);
	return 0;
}

result:

从投影的结果来看,很是可以,但是这个图像是比较规整的,我需要进行各种复杂图像处理。

  •  Well, from the projection, it works, but this is a neat image, and I need to do all kinds of complicated image processing.

 I hope I can help you,If you have any questions, please  comment on this blog or send me a private message. I will reply in my free time.  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值