繁体   English   中英

OpenCV / C ++ - 编辑所有孤立的像素

[英]OpenCV / C++ - Edit all isolated pixels

我有一个灰度图像,只包含黑色和白色。 由于噪音,有一些孤立的黑色像素,我想摆脱它。 我知道打开和关闭可能是一个解决方案,但我觉得它们不适合我的形象。 所以我写了这个:

for (int i = 1; i < pixels.rows; ++i) {
    for (int j = 1; j < pixels.cols; ++j) {
        if ((pixels.at<char>(i, j) == 0) && 
            (pixels.at<char>(i - 1, j) == 255) && 
            (pixels.at<char>(i, j - 1) == 255) && 
            (pixels.at<char>(i + 1, j) == 255) && 
            (pixels.at<char>(i, j + 1) == 255)) {
            pixels.at<char>(i, j) = 255;
        }
    }
}

它应该贯穿我的图像,并检查像素是否是黑色,他的邻居是否是白色。 如果是这种情况,像素也应该变成白色像素。 我在测试图像上运行了这个,这是由这个Mat创建的:

Mat pixels = (Mat_<float>(5, 5) <<
    255, 255, 255, 255, 255,
    255, 0, 255, 0, 255,
    255, 255, 255, 255, 255,
    255, 0, 255, 0, 255,
    255, 255, 255, 255, 255);

当我运行代码时没有发生任何事情,只是原始图像出现了......

当我运行一个更简单的代码版本时,它工作,所以语法实际应该是正确的:

    for (int i = 1; i < pixels.rows; ++i) {
    for (int j = 1; j < pixels.cols; ++j) {
        if ((pixels.at<char>(i, j) == 0)) {
            pixels.at<char>(i, j) = 255;
        }
    }
}

有没有人发现我的错误?

该过程基本上是正确的,但您正在创建一个float Mat并且您将其作为char访问它。 您需要类型相同。

您的迭代范围也需要修复。 您可能还需要检查8连接,否则中心像素设置为0的图像将无法按预期工作

还记得char范围是[-128,+ 127],因此它永远不会比较等于255。

这是一个有效的例子。 我使用uchar ,因为你正在处理灰度图像时它可能是你需要的类型:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;

int main()
{
    Mat pixels = (Mat_<uchar>(5, 5) <<
        255, 255, 255, 255, 255,
        255, 0, 255, 0, 255,
        255, 255, 255, 255, 255,
        255, 0, 255, 0, 255,
        255, 255, 255, 255, 255);

    for (int i = 1; i < pixels.rows - 1; ++i) {
        for (int j = 1; j < pixels.cols - 1; ++j)
        {
            if ((pixels.at<uchar>(i, j) == 0) &&
                (pixels.at<uchar>(i - 1, j - 1) == 255) &&      // Top Left
                (pixels.at<uchar>(i - 1, j + 0) == 255) &&      // Top 
                (pixels.at<uchar>(i - 1, j + 1) == 255) &&      // Top Right
                (pixels.at<uchar>(i + 0, j - 1) == 255) &&      // Left
                (pixels.at<uchar>(i + 0, j + 1) == 255) &&      // Right
                (pixels.at<uchar>(i + 1, j - 1) == 255) &&      // Bottom Left
                (pixels.at<uchar>(i + 1, j + 0) == 255) &&      // Bottom
                (pixels.at<uchar>(i + 1, j + 1) == 255)         // Bottom Right
                )
            {
                pixels.at<uchar>(i, j) = 255;
            }
        }
    }

    std::cout << pixels;

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM