我想查看颜色相对于图像宽度的分布。也就是说,如果(黑白)图像的宽度为720像素,那么我想得出一个结论,即与图像的其余部分相比,特定范围(例如,像素[500,720])具有更多的白色。我想的是,我需要对720x1 px的图像进行切片,然后需要检查这些值并将其分配给w.r.t.宽度720像素。但是我不知道如何以合适的方式应用它?
编辑:我在C ++中使用OpenCV 4.0.0。
示例情况:在第一张图像中,很明显右侧像素为白色。我想获取此密集线或区域的估计坐标。浅粉红色区域是我感兴趣的区域,红色边框是我要找到它的区域。
答案 0 :(得分: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]++;
}
}
}
您需要在此数组中找到满足条件Sum(Arr [0到A-1])+ Sum(Arr [B + 1到Width-1])的最小范围[A; B] 如果您预先计算所有[0; i]的范围是从0到宽度-1。比起// 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";
RangeSum(Arr, A, B)
来计算PrecalculatedSums[B] - PrecalculatedSums[A]
(复杂度为O(1))。