我对 Otsu 的方法有疑问。我想实现直方图来计算有多少个“和”。对于 Otsu 的方法,我有一个书中的代码,它运行没有问题。这是图片
.
我已经实现了一个代码来计算直方图。这是我的代码的输出。
------------------
0 : 14332
1 : 2102
2 : 1387
3 : 745
4 : 221
5 : 117
6 : 27
7 : 9
248 : 6
249 : 12
250 : 48
251 : 162
252 : 396
253 : 830
254 : 1377
255 : 28554
------------------
这是我的代码:
I = imread('images.jpg');
level = graythresh(I);
BW = im2bw(I, level);
imshow(BW)
imwrite(BW, 'img.jpg');
这是我的 C++ 代码。
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv\cv.h>
#include <map>
#include <iomanip>
std::map<int, int> computeHistogram(const cv::Mat& image)
{
std::map<int, int> histogram;
for ( int row = 0; row < image.rows; ++row)
{
for ( int col = 0; col < image.cols; ++col)
{
++histogram[(int)image.at<uchar>(row, col)];
}
}
return histogram;
}
void printHistogram(const std::map<int, int>& histogram)
{
std::map<int, int>::const_iterator histogram_iter;
std::cout << "\n------------------\n";
for( histogram_iter = histogram.begin(); histogram_iter != histogram.end(); ++histogram_iter)
{
std::cout << std::setw(5) << histogram_iter->first << " : " << histogram_iter->second << "\n";
}
std::cout << "------------------\n";
}
int main(int argc, char **argv)
{
cv::Mat img = cv::imread("img.jpg", CV_BGR2GRAY);
printHistogram(computeHistogram(img));
return 0;
}
为什么会是这样的结果?我期待的是多少 255 和 0(仅限黑色和白色)。此外,如果我运行另一张图片,我会得到另一个范围为 0-255 的结果。