如何确定x轴像素范围内的像素强度?

3
我想查看颜色相对于图像宽度的分布。也就是说,如果一张(黑白)图片的宽度为720个像素,则我想得出结论:某个特定范围(例如像素[500,720])与其余部分相比具有更多的白色。我的想法是,我需要一个720x1像素的图像切片,然后我需要检查值并将它们分配到720像素的宽度上。但我不知道如何以适当的方式应用它?
编辑:我使用带有C ++的OpenCV 4.0.0。
示例案例:在第一张图片中,右侧像素明显是白色的。我想获取这条密集线或区域的估计坐标。浅粉色区域是我感兴趣的区域,红色边框是我想要找到它的范围。

enter image description here enter image description here


我完全不理解这个问题。您是在尝试将曲线拟合到黑色与白色相遇的边缘吗?答案会是一个点、一条线或其他什么东西吗?请问您能否添加第二张图像,并在上面用红色标出答案? - Mark Setchell
@MarkSetchell,我已经附加了一张图片来澄清我的问题。实际上,我正在寻找像素线范围。 - Erdem Tuna
1个回答

1
如果您想获得包含比图像其余部分更多白色像素的最小连续列范围,则首先需要计算每列中白色像素的数量。假设我们有一个720x500的图像(高度为500像素,宽度为720像素),那么您将得到一个由720个元素组成的数组Arr,分别表示每列(1x500)中的白色像素数量。
const int Width = img.cols;
int* Arr = new int[Width];
for( int x = 0; x < Width; x++ ) {
    Arr[x] = 0;
    for( int y = 0; y < img.rows; y++ ) {
        if ( img.at<cv::Vec3b>(y,x) == cv::Vec3b(255,255,255) ) {
            Arr[x]++;
        }
    }
}

你需要在这个数组中找到一个最小的范围[A;B],满足条件Sum(Arr[0 to A-1]) + Sum(Arr[B+1 to Width-1]) < Sum(Arr[A to B])。
// minimum range width is guaranteed to be less or equal to (Width/2 + 1)
int bestA = 0, minimumWidth = Width/2 + 1;
int total = RangeSum(Arr, 0, Width-1);
for (int i = 0; i < Width; i++) {
    for (int j = i; j < Width && j < i + minimumWidth; j++) {
        int rangeSum = RangeSum(Arr, i, j);
        if (rangeSum > total - rangeSum) { 
            bestA = i; 
            minimumWidth = j - i + 1; 
            break;
        }
    }
}

std::cout << "Most white minimum range - [" << bestA << ";" << bestA + minimumWidth - 1 << "]\n";

如果您预先计算所有[0; i]范围的总和,其中i从0到Width-1,则可以优化代码。然后,您可以将RangeSum(Arr, A, B)计算为PrecalculatedSums[B] - PrecalculatedSums[A](在O(1)复杂度下)。


嗨@Oliort,感谢您的回答。我实际上想找到所有列中最大或最密集的白色范围。您的代码激发了我的灵感。当我在第一个代码块中评估Arr时,我设置了一个与img.rows相关的置信区间,以确定哪个像素范围落入该区间。感谢您的回答。 - Erdem Tuna
自从我使用了您的答案,我接受它作为答案。 - Erdem Tuna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接