C 需要图像细节

C 需要图像细节,c,matlab,image-processing,C,Matlab,Image Processing,作为一个学校项目,我正在为一个嵌入式系统实现一个小型的图像库,我想提供matlab提供的相同功能。我已经实现了一些基本的东西,比如读取图像、阈值、一些很酷的效果等等 我面临的问题是,我找不到关于如何在rbga图像上应用过滤器(基于内核)的资源。我的意思是,我找到了一种对每个颜色通道和处理的每个像素使用临时总和的方法。我也试着这么做,但失败了。计算结果与matlab不一致。对我来说,在matlab中获得完全相同的结果是非常重要的,因为这将意味着所有设计用于在matlab中运行的东西都将与我的代码一

作为一个学校项目,我正在为一个嵌入式系统实现一个小型的图像库,我想提供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
对于i255,则rsum=255
如果gsum>255,则gsum=255
如果bsum>255,则bsum=255

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

y[n] = SUM x[n-k] . h[k]
        k
其中
h
是内核。通常,您会为每个颜色通道独立计算此值

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


你没有解释“失败”是什么意思;结果完全是胡说八道,还是接近(在一定误差范围内)?如果是后者,那么你可能会成为浮点运算局限性的牺牲品;Matlab的计算顺序可能与您的略有不同,从而产生不同的舍入效果。

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

y[n] = SUM x[n-k] . h[k]
        k
其中
h
是内核。通常,您会为每个颜色通道独立计算此值

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


你没有解释“失败”是什么意思;结果完全是胡说八道,还是接近(在一定误差范围内)?如果是后者,那么你可能会成为浮点运算局限性的牺牲品;Matlab的计算顺序可能与您略有不同,从而产生不同的舍入效果。

今天晚些时候,我将尝试添加图像和伪代码。结果并不接近,所以我认为这与浮点运算无关。在边缘部分,我决定使用零填充。@marcushatchenson:好的,很难做出精确的注释,因为您没有显示真正的C代码。但需要检查的是:*您的像素值是0->255还是-128->127?*你是如何处理边界的?*您是向单独的输出数组写入,还是回写到输入数组?值为0-255,我正在向单独的输出数组写入。很抱歉没有发布真正的C代码,但它现在真的很混乱。最后我发现了问题所在。我把A频道放在最后8位。我不得不使用前8位。今天晚些时候我将尝试添加图像和伪代码。结果并不接近,所以我认为这与浮点运算无关。在边缘部分,我决定使用零填充。@marcushatchenson:好的,很难做出精确的注释,因为您没有显示真正的C代码。但需要检查的是:*您的像素值是0->255还是-128->127?*你是如何处理边界的?*您是向单独的输出数组写入,还是回写到输入数组?值为0-255,我正在向单独的输出数组写入。很抱歉没有发布真正的C代码,但它现在真的很混乱。最后我发现了问题所在。我把A频道放在最后8位。我必须使用前8位。只是猜测一下:您是否重新缩放结果以使用完整的0->255范围(matlab通常会这样做)?-此外,确保因子在被乘以之前都被浇铸为浮动。我正在做我在问题中描述的事情。如果有负值,我将其更改为0;如果有大于255的值,我将其更改为255。不,我不想投浮子。我使用4 uint8表示1个像素,我的系统不支持浮点运算。只是猜测一下:您是否重新缩放结果以使用完整的0->255范围(matlab通常会这样做)?-此外,确保因子在被乘以之前都被浇铸为浮动。我正在做我在问题中描述的事情。如果有负值,我将其更改为0;如果有大于255的值,我将其更改为255。不,我不想投浮子。我使用4 uint8表示1像素,我的系统不支持浮点运算。