我在编写自适应中位数的代码时遇到了问题。
计算最小强度像素最大 n 中值的最佳方法是什么?
直到现在我读取了图像像素的每个值
for (int y = 0; y < h; y++)
{
uchar *ptr = (uchar*)(img->imageData + y * step);
for (int x = 0; x < w; x++){
printf("%u, ", ptr[x]);
}
printf("\n");
}
我在编写自适应中位数的代码时遇到了问题。
计算最小强度像素最大 n 中值的最佳方法是什么?
直到现在我读取了图像像素的每个值
for (int y = 0; y < h; y++)
{
uchar *ptr = (uchar*)(img->imageData + y * step);
for (int x = 0; x < w; x++){
printf("%u, ", ptr[x]);
}
printf("\n");
}
对于最小/最大像素,您需要记录第一个像素的值,然后将其他像素与其进行比较,如果它分别较低/较高,则存储新值。OpenCV 提供了cv::minmaxLoc来简化此操作。
对于中位数,您需要对所有像素进行排序并选择中间的像素(当然,一旦排序,找到最小值/最大值是微不足道的,因为它们将位于列表的任一端)。这更棘手,你走了多远,什么不起作用?
对于矩形窗口中的最大值和最小值,我会参考van Herk 的膨胀算法,因为灰度膨胀对应于最大值算子,而灰度腐蚀到最小值算子和矩形结构元素可以分解为垂直线和水平线.
对于中值滤波,我会考虑移动直方图技术。