需要成像细节

时间:2012-02-28 23:25:10

标签: c matlab image-processing

我正在为嵌入式系统实现一个小型成像库作为学校项目,我想提供matlab提供的相同功能。我已经实现了一些基本的东西,如阅读图像,阈值处理,一些很酷的效果等。

我面临的问题是我无法找到有关如何在rbga图像上应用滤镜(基于内核)的资源。我的意思是我找到了一些东西,它为每个颜色通道和处理的每个像素使用临时总和。我试着做同样但我失败了。结果与matlab不一样。对我来说,使用matlab获得完全相同的结果非常重要,因为这意味着所有设计为在matlab中运行的设置也将与我的代码一起运行。

我想知道是否有关于这些事情的书。 matlab是否解释了函数的实现方式?

修改

例如我应用prewittX内核

>> a = imread('Hydrangeas.jpg');
>> w = [-1 0 1; -1 0 1; -1 0 1];
>> b = imfilter(a,w);
>> imshow(b)

我做的是这样的事情

for i < img.height, i++
 for j < img.width, j++
  rsum = pixel[i-1,j-1].R*(-1) + pixel[i-1,j+1].R*(1)
  rsum += pixel[i,j-1].R*(-1) + pixel[i,j+1].R*(1)
  rsum += pixel[i+1,j-1].R*(-1) + pixel[i+1,j+1].R*(1)

  gsum = pixel[i-1,j-1].G*(-1) + pixel[i-1,j+1].G*(1)
  gsum += pixel[i,j-1].G*(-1) + pixel[i,j+1].G*(1)
  gsum += pixel[i+1,j-1].G*(-1) + pixel[i+1,j+1].G*(1)

  bsum = pixel[i-1,j-1].B*(-1) + pixel[i-1,j+1].B*(1)
  bsum += pixel[i,j-1].B*(-1) + pixel[i,j+1].B*(1)
  bsum += pixel[i+1,j-1].B*(-1) + pixel[i+1,j+1].B*(1)

  if rsum>255, rsum=255
  if gsum>255, gsum=255
  if bsum>255, bsum=255

  if rsun<0, rsun=0
  if gsun<0, gsun=0
  if bsun<0, bsun=0

  img.setpixel(i,j) = (rsum|gsum|bsum)
 end
end

我也不知道如何处理A通道,因为我正在处理RGBA图像。

这是我得到的输出

my output

matlab的输出

matlab output

1 个答案:

答案 0 :(得分:5)

使用convolution实现简单图像过滤器。每个输出点只是相应输入点和其邻域中其他点的加权和。内核只是一个描述这些权重的数组。在1D中,它只是:

y[n] = SUM x[n-k] . h[k]
        k

其中h是内核。通常,您可以为每个颜色通道单独计算。

一旦卷积工作,最难的问题是在图像的边缘做什么。有各种策略(例如零填充,扩展值,包装,镜像),但没有一个正确的答案;这取决于你的目标。

你没有解释“失败”是什么意思;结果完全是胡说八道,还是接近(在某个误差范围内)?如果是后者,那么你可能会成为浮点运算限制的牺牲品; Matlab可能会以稍微不同的顺序计算事物,导致不同的舍入效果。