c++ - 如何确定相对于 x 轴像素范围的像素强度?
问题描述
我想查看颜色相对于图像宽度的分布。也就是说,如果(黑白)图像的宽度为 720 像素,那么我想得出结论,与图像的其余部分相比,特定范围(例如像素 [500,720])具有更多的白色。我的想法是,我需要一个 720x1 像素的图像切片,然后我需要检查这些值并将它们分配为 720 像素的宽度。但我不知道如何以合适的方式应用它?
编辑:我将 OpenCV 4.0.0 与 C++ 一起使用。
示例案例:在第一张图像中,很明显右侧像素是白色的。我想获得这条密集线或区域的估计坐标。浅粉色区域是我感兴趣的区域,红色边框是我想要找到它的范围。
解决方案
如果您想获得包含比图像其余部分更多的白色的图像列的最小连续范围,则首先需要计算每列中白色像素的数量。假设我们有一个 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 to A-1]) + Sum(Arr[B+1 to Width-1]) < Sum(Arr[A to乙])。
// 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) 复杂度中)。
推荐阅读
- oracle-apex - 将日期选择器的值设置为 sysdate 检索另一个日期
- c - realloc 调用失败并抛出 SIGABORT 信号
- python - Pandas 数据框中的经过时间
- swift - SWift 错误域=AVFoundationErrorDomain 代码=-11819 "无法完成操作 "NSLocalizedRecoverySuggestion=稍后再试。,
- google-admin-sdk - 是否可以使用 GoogleAppsScript 获取 google admin 的管理地址列表?
- php - 使用 Codeigniter 打印日志文件中的所有数据库查询(ajax 请求)
- javascript - 如何根据时隙将对象时间序列数组拆分为多个时间序列?
- python - 检测图像中的最大像素距离
- sql-server-2014 - 基于同一张表添加和/或更新
- selenium - 在 Firefox 扩展中压缩 HAR (json) 文件