c++ - 遍历区域并在 OpenCV 中获取平均像素值?

标签 c++ opencv image-processing grid-layout roi

所以我主要是尝试通过调整初始图像的大小来划分灰度图像(在本例中为 32x32)。

“区域”划分后,我需要取每个区域的平均像素值,然后将 1、0 或 X 添加到字符串中。例如:“区域 (3, 19) 有一个平均值值为 21,所以这是一个 1"。

我想我已经掌握了大部分逻辑,但理论上,输出不应该以 1、0 和 X 的形式重新创建图像吗?我觉得我的数学在 for 循环上可能是错误的?请记住,我所做的只是将图像分解为 MxN 表格或网格,并取每个网格区域的均值、0 channel 值。

这是我的代码:

Mat image = imread("blackdot.jpg", IMREAD_GRAYSCALE); //Pass in image
imshow("Gray scaled image", image);                     //imshow("Passed in gray scale image", image);

Mat resizedImage; // New Mat for saving the blown up image
resize(image, resizedImage, Size(3200, 3200)); // Blow up image so it's divisible by 32 using passed in image

string bitStream; // Ternary bitstream 

for (int y = 0; y<resizedImage.cols - 32; y += 32) {
    for (int x = 0; x<resizedImage.rows - 32; x += 32) {
        // get the average for the whole 32x32 block
        Rect roi(x, y, 32, 32);
        Scalar mean, dev;
        meanStdDev(resizedImage(roi), mean, dev); // mean[0] is the mean of the first channel, gray scale value;

        if (mean[0] >= 0 && mean[0] <= 25) {
            if ((counter % 3200) == 2900) {
                bitStream += "1\n";
                counter = 0;
            }
            else {
                bitStream += "1";
        }
        else if (mean[0] >= 77 && mean[0] <= 153) {
            if ((counter % 3200) == 2900) {
                bitStream += "X\n";
                counter = 0;
            }
            else {
                bitStream += "X";
        }
        else {
            if ((counter % 3200) == 2900) {
                bitStream += "0\n";
                counter = 0;
            }
            else {
                bitStream += "0";
        }
    }
}

cout << bitStream;

blackdot.jpg

最佳答案

代码和逻辑看起来不错,对于每个像素分布,将相应的字符添加到比特流,并对行中的所有像素和图像中的每一列重复该操作。

当向比特流中添加字符时,尝试在到达换行符时(即当行已完成时)将 \n 附加到比特流中,以在比特流中说明对齐方式的图像。这相当于您的代码中的这个小调整:

for (int y = 0; y<resizedImage.cols - 32; y += 32) {
    for (int x = 0; x<resizedImage.rows - 32; x += 32) {
        // get the average for the whole 32x32 block
        Rect roi(x, y, 32, 32);
        Scalar mean, dev;
        meanStdDev(resizedImage(roi), mean, dev); // mean[0] is the mean of the first channel, gray scale value;

        if (mean[0] >= 0 && mean[0] <= 25) {
            bitStream += "1";
        }
        else if (mean[0] >= 77 && mean[0] <= 153) {
            bitStream += "X";
        }
        else {
            bitStream += "0";
        }
    }
    //after each row has been checked, add newline
    bitStream += '\n';
}

注意:输出窗口可能需要最大化才能看到正确的结果。

关于c++ - 遍历区域并在 OpenCV 中获取平均像素值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49375685/

相关文章:

c++ - 源行长度限制

c++ - 是否有像 C++ std set 这样的数据结构也可以快速返回范围内的元素数量?

python - 使用 Python 在两个图像中查找匹配的数据点

opencv - 足球检测和跟踪——使用 AI 技术?

c++ - nodejs native c++ npm模块内存错误,开罗图像处理

c++ - 为什么 ranges::view_interface<T>::size 需要移动构造函数

c++ - OpenCv 实现高斯模糊

c# - 如何计算EMGU中两幅图像之间的相关性?

android - 使用 Android OpenCv 逐帧读取视频

python - 用于图像缩放的双三次插值