我正在为单通道图像实现一种非常简单的分割算法。该算法的工作原理如下:
对于单通道图像:
如果stddev> 15(又名门槛):
其他:
出现我的问题是因为我的阈值是不变的,当我递归时15
不再是该图像是否是同质的一个很好的标志。 如何在同质性检查中引入一致性/规范化?
我应该将每张图片调整为相同尺寸(100x100)吗?我的门槛应该是公式吗?说15 / img.rows * img.cols
或15 / MAX_HISTOGRAM_PEAK
?
修改代码:
void split_mat(const Mat& src, Mat& split1, Mat& split2, Mat& split3, Mat& split4) {
split1 = Mat(src, Rect(Point(0, 0), Point(src.cols / 2, src.rows / 2)));
split1 = Mat(src, Rect(Point(src.cols/2, 0), Point(src.cols, src.rows / 2)));
split3 = Mat(src, Rect(Point(0, src.rows/2), Point(src.cols / 2, src.rows)));
split4 = Mat(src, Rect(Point(src.cols/2, src.rows/2), Point(src.cols, src.rows)));
}
void segment_by_homogeny(const Mat& src, double threshold) {
Scalar mean, stddev;
meanStdDev(src, mean, stddev);
double dev = stddev[0]; // / (src.rows * src.cols) * 100.0;
if (dev >= threshold) {
Mat s1, s2, s3, s4;
split_mat(src, s1, s2, s3, s4);
// Go recursive and segment each sub-segment where necessary
segment_by_homogeny(s1, threshold);
segment_by_homogeny(s2, threshold);
segment_by_homogeny(s3, threshold);
segment_by_homogeny(s4, threshold);
}
else {
// Store 'segment' in global vector 'images'
// and write std dev on it
char d[255];
sprintf_s(d, "Std Dev: %f", stddev[0]);
putText(src, d, cvPoint(30, 60),
FONT_HERSHEY_COMPLEX_SMALL, 0.7, cvScalar(200, 200, 250), 1, CV_AA);
images.push_back(src);
}
}
// current usage for the example image results in inifinite recursion.
// The green and red segment never has a std dev < 25
segment_by_homogeny(img, 25);
我期待我的算法生成以下5个段:
答案 0 :(得分:0)
您可以简化算法。因为您想将给定区域划分为4个子区域,您可以先将其划分为4个子区域,然后计算每个子区域的平均亮度值,并在这些邻域值之间的差值上设置阈值。