【发布时间】:2011-10-22 19:01:42
【问题描述】:
我的问题可能听起来很愚蠢,但请理解我不在教授可以给我体面帮助的大学/学院学习。我是自学的,对我来说几乎没有 3-4 个月的编码。因此,我请求 SO 用户耐心等待。
我正在尝试编写一个简单的过滤器函数,其中我定义了一个 kernel,一个 3x3 2D 数组。我创建了另一个矩阵load,我想在其中存储我的图像数组的像素值。我面临2个主要问题。对于第一个问题,我完全感到困惑和困惑。我读到这个关于How do I gaussian blur an image without using any in-built gaussian functions? 的精彩回答,它提到:
对于像素 11,您需要加载像素 0、1、2、10、11、12、20, 21、22。
然后您将像素 0 乘以 3x3 的左上部分 模糊滤镜。顶部中间的像素 1,像素 2,右上角的像素 3, 像素 10 到左中,以此类推。
我想知道对于具有 3 个通道的IplImage,我如何在我的load 矩阵中存储相应的像素 [如上面链接中所述],因为我很困惑的是有 3 个值 [RGB ],所以我应该将什么与什么相乘??
另外如何确保像素不超出范围?因为一旦我们靠近图像的边缘,像素值可能会超出范围。
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];
}
}
}
【问题讨论】:
-
如果你看看这个(有趣的)和活跃的问题:stackoverflow.com/questions/7860575/…我想你会发现它有很多相似之处。
-
也查找卷积矩阵并快速浏览处理的网站,他们有教程(显然是用于处理),但它们写得很好,很容易转换成 C++