gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:23 26 4
gpt4 key购买 nike

我的问题可能听起来很愚蠢,但请理解我不是在教授可以给我体面帮助的大学/学院学习。我是自学的,对我来说几乎没有 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com