需要成像细节

kec*_*ito 1 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)
Run Code Online (Sandbox Code Playgroud)

我做的是这样的

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
Run Code Online (Sandbox Code Playgroud)

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

这是我得到的输出

我的输出

matlab的输出

matlab输出

Oli*_*rth 5

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

y[n] = SUM x[n-k] . h[k]
        k
Run Code Online (Sandbox Code Playgroud)

h内核在哪里 通常,您可以为每个颜色通道单独计算.

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

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