算法描述:三角几何化的过程。首先找到直方图中灰度值频率最高的一点并判别该灰度级处于128(256个灰度级的一半)的左侧还是右侧,然后找到最左边点或最右边点,两点连接一条直线,求直方图上离直线最远的点,设置该点的灰度值为阈值。
算法特点:多适用于C++代码
void Triangle1(unsigned char* inputImg, unsigned char* outputImg, int width, int height)
//{
// int histogram[256] = { 0 };
//
// for (int i = 0; i < height; i++)
// {
// for (int j = 0; j < width; j++)
// {
// histogram[(int)inputImg[i * width + j]] ++;
// }
// }
//
// /*for (int i = 0; i < height; i++)
// {
// for (int j = 0; j < width; j++)
// {
// cout<<
// }
// }*/
//
//
//
// histogram[0] = 0;
// histogram[1] = 0;
// //histogram[2] = 0;
// //histogram[3] = 0;
// histogram[255] = 0;
//
// /**找到直方图的纵坐标与横坐标标**/
// float max = 0;
// int maxidx = 0;
// for (int i = 0; i < 256; ++i)
// {
// if (histogram[i] > max)
// {
// max = histogram[i]; //纵坐标
// maxidx = i; //横坐标
// }
// }
//
// bool lr = maxidx < 127; //布尔类型,判断波峰处于直方图左边还是右边
//
// float maxd = 0;
// int maxdidx = 0;
// if (lr)
// {
// float A = float(-max); // A=(y2-y1)
// float B = float(maxidx - 255); // B=(x1-x2)
// float C = float(max * 255); //c=(x2*y1-x1*y2) 默认是的点是(255,0)
//
// for (int i = maxidx + 1; i < 256; ++i)
// {
// float x0 = float(i);
// float y0 = histogram[i];
// float d = abs(A * x0 + B * y0 + C) / std::sqrt(A * A + B * B); //点到直线距离公式
// if (d > maxd)
// {
// maxd = d;
// maxdidx = i;
// }
// }
// }
//
// else
// {
// float A = float(-max);
// float B = float(maxidx);
// float C = 0.0f;
//
// for (int i = 0; i < maxidx; ++i)
// {
// float x0 = float(i);
// float y0 = histogram[i];
// float d = abs(A * x0 + B * y0 + C) / std::sqrt(A * A + B * B); //点到直线距离公式
// if (d > maxd)
// {
// maxd = d;
// maxdidx = i;
// }
// }
// }
//
// cout << "分割阈值" << maxdidx << endl;
//
// for (int i = 0; i < height; i++)
// {
// for (int j = 0; j < width; j++)
// {
// if (inputImg[i * width + j] > maxdidx)
// {
// outputImg[i * width + j] = 0;
// }
// if (inputImg[i * width + j] < maxdidx)
// {
// outputImg[i * width + j] = 255;
// }
// }
// }
//}
大致示意图如下所示: