c++ - 初学者对图像过滤的尝试

标签 c++ opencv

我的问题可能听起来很愚蠢,但请理解我不是在教授可以给我体面帮助的大学/学院学习。我是自学的,对我来说几乎没有 3-4 个月的编码时间。因此,我请求 SO 用户耐心等待。

我正在尝试编写一个简单的过滤器函数,我在其中定义了一个 kernel,一个 3x3 二维数组。我创建了另一个矩阵 load,我想在其中存储图像数组的像素值。我面临两个主要问题。对于第一个问题,我完全感到困惑和困惑。我读了这个关于 How do I gaussian blur an image without using any in-built gaussian functions? 的绝妙答案,它提到:

For pixel 11 you would need to load pixels 0, 1, 2, 10, 11, 12, 20, 21, 22.

you would then multiply pixel 0 by the upper left portion of the 3x3 blur filter. Pixel 1 by the top middle, pixel 2, pixel 3 by top right, pixel 10 by middle left and so on.

我想知道对于具有 3 个 channel 的 IplImage 我如何在我的 load 矩阵中存储相应的像素 [如上面的链接中所述] 因为我我很困惑是否有 3 个值 [R G B],所以我应该将什么乘以什么??

又如何保证Pixels不越界?因为一旦我们靠近图像的边缘,像素值可能会超出范围。

void filter(const IplImage *img) 
{
    unsigned char kernel[][3]  = { 1,  2,  1, 
                                   2,  1,  2, 
                                   1,  2,  1 , };
    unsigned char load[][3] = { 0 };
    int rows=img->height,cols=img->width,row,col;
    uchar* temp_ptr=0 ;

    for( row = 0; row < rows; ++row) 
    {

            for ( col = 0; col < cols; ++col) 
            {
                CvPoint pt = {row,col};
                temp_ptr  = &((uchar*)(img->imageData + (img->widthStep*row)))[col*3];

            }
    }

}

最佳答案

对于您的 RGB 问题:您将内核分别应用于每个 channel 。也就是说,您基本上将这三个 channel 视为三张独立的单色图片,并对每张图片进行模糊处理。

原则上确保您的像素不越界很简单:当您访问像素时,首先测试像素是否会越界,如果是,则不要访问它。然而,有趣的问题是该怎么做。一种可能性是不将过滤器应用于内核将超过图像的边界点,但这意味着留下一个清晰的边界(除非你能承受失去一个像素的边界,在这种情况下这可能是最佳解决方案)。另一种解决方案是为外部像素假设某种颜色(例如白色)。第三个选项,我认为这里是最好的,就是不使用这些点,而是使用仅包含掩码边界内像素的简化内核。请注意,在这种情况下,您还需要调整归一化因子。

顺便说一句,你确定你的内核描述了模糊吗?我原以为中间值会最大以产生模糊。

关于c++ - 初学者对图像过滤的尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7861907/

相关文章:

c++ - 如何将标准例程添加到函数指针数组中的每个函数?

c++ - 创建没有 (OpenSSL) 依赖项的静态库

opencv - 使用opencv2.4检测正方形

c++ - 拍摄第一张网络摄像头照片后,OpenCV 不保存第二张网络摄像头照片

c++ - 如何在 C++ 中创建一个 "default"流插入运算符?

c++ - 如何在给定 dims+1 点的情况下找到任意维球体的中心和半径

c++ - 为什么堆已损坏?

python - 使用 Python 在 OpenCv 中设置 ORB 参数

matlab - Matlab 计算机视觉工具箱功能是如何制作/编写的?

c++ - ((CXXMethodDecl*)(VarDecl->getParentFunctionOrMethod())) 中的 CLang 程序段错误