【问题标题】:OpenCV image analysis on 32x32 image sections?对 32x32 图像部分进行 OpenCV 图像分析?
【发布时间】:2018-03-15 10:18:41
【问题描述】:

我试图将传入的 1920x1080 灰度图像划分为 32x32 的“块”或“部分”。有点像一个虚构的叠加网格。

完成此操作后,我需要遍历每个单独部分中的每个像素,以对每个像素返回的单个通道、灰度值进行分析。

例如:

//For block (x,y):

    if (pixelVal >= 120 && pixelVal <= 130) {
        bitStream += "1"; 
    } else if (pixelVal >= 135 && pixelVal <= 140) {
        bitstream += "0";
    } else {
        bitStream += "X";
    }

这有意义吗?我对 OpenCV 和 C++ 非常陌生,基本上我知道如何显示、循环和返回给定点的像素值,而不是在某个预定区域内。前几天我问了一个类似的问题,但它是针对阈值,而不是单通道值。我正在考虑创建某种循环遍历每个窗口的窗口,其中的像素值使用我上面的条件进行比较。

【问题讨论】:

    标签: c++ opencv image-processing


    【解决方案1】:

    由于灰度像素的值已经从0-255 定义,因此您可以创建一个大小为256 的数组,并根据您的条件使用"0""1""x" 预填充该数组。此查找表稍后将帮助您非常有效地替换值。此技术在 OpenCV 方法内部使用,例如 cv::threshold

    然后您可以使用cv::Mat cropped = bigger_mat(rect) 裁剪图像,其中bigger_mat 是1920x1080 维度矩阵,rectcv::Rect(x, y, w, h) 对象,它定义了裁剪的位置和大小。

    然后,您可以使用两个嵌套的 for 循环来循环每个裁剪后的垫子的行和列,并使用 img.at&lt;uchar&gt;(j,i) 访问每个像素。对于检索到的每个值,您可以使用上面创建的查找数组来获取替换并附加到您的比特流。

    【讨论】:

    • 感谢 ZdaR!我对你所说的第一部分感到困惑。我不知道为什么我在做任何事情之前用 0s、1s 和 Xs 预先填充一个数组。让我进一步解释一下,因为我认为我不是很清楚: 1. 传递图像。阅读。 2. 将图像划分为 32x32 的部分,其中 (0,0) 是图像的左上部分。 3. 循环遍历每个部分,得到每个像素的灰度值。 4. 如果像素值在设定范围内,则在输出的比特流中添加 1、0 或 X。这更有意义吗?
    • @CrowHop:他建议你用查找表替换 if/elseif/else 结构,这样会快得多。您在程序开始时预先计算表格,然后在内部循环中使用它来查找每个像素的输出内容。
    • 我明白了。巧妙!所以基本上我每次在程序开始之前都会发送初始值。现在为“rect”功能;在这种情况下,“(x,y)”将是 for 循环的 i 和 j,因为它们将在图像中移动。 W 和 H 将是 32x32....我不太确定这将如何工作,因为尺寸可能会导致某种内存问题。
    • 您必须尝试一下,然后发布相关代码才能解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    相关资源
    最近更新 更多