投影简单来说就是将图像中的像素进行横向以及纵向的综合计数处理。
- 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.