要分割用于亮度直方图的牌照字符。 为了解决这个问题,我写了这段代码:
std::vector<int> computeColumnHistogram(const cv::Mat& img)
{
size_t width = img.size().width;
size_t height = img.size().height;
auto prow = img.ptr(0);
std::vector<int> histogram(width,0); //Create a zeroed histogram of the necessary size
for (int y = 0; y < height; y++)
{
prow = img.ptr(y); // Get a pointer to the y-th row of the image
for (int x = 0; x < width; x++)
histogram[x] += prow[x]; // Update histogram value for this image column
}
for (int x = 0; x < width; x++)
histogram[x] /= height;
int max = *std::max_element(histogram.begin(), histogram.end());
cv::Mat histo;
histo = cv::Mat::zeros(cv::Size(width,max), CV_8U);
for(int i=0; i< width; ++i)
{
for(int j=0; j< histogram.at(i); ++j)
histo.at<unsigned char>(max-j-1,i) = 255;
}
imshow("hh", histo);
return histogram;
}
int main(int argc, char** argv)
{
cv::Mat img = imread(argv[1], 0);
imshow("Sourse", img);
std::vector<int> hist = computeColumnHistogram(img);
for(auto &e : hist)
std::cout << e << std::endl;
waitKey();
return 0;
}
图像1上显示的程序输出:
Image 1 (http://i.stack.imgur.com/d56Cy.png)
我尝试了很多方法来确定符号的位置,但都无济于事。
我发现了一篇描述使用局部最大值的类似方法的文章。 Image 2 (http://i.stack.imgur.com/lp1MD.png)
如何重复结果?
答案 0 :(得分:0)
我会首先尝试阈值图像来获取符号/背景的二进制图像(例如:http://www.ijcset.net/docs/Volumes/volume2issue1/ijcset2012020103.pdf)。在阈值处理之后,使用中值滤波器来移除分割后剩余的类似噪声的像素就足够了。
图像经过中值滤波后,只需开始在图像中查找黑色的第一个像素并执行区域增长,即可找到对象(符号)最右边的黑色像素。完成后,从上一个对象的最右边的像素开始重新启动算法(从黑色中查找最左边的像素)。这样,您将获得每个符号的初始和结束像素。