我正在为嵌入式系统实现一个小型成像库作为学校项目,我想提供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图像。
答案 0 :(得分:5)
使用convolution实现简单图像过滤器。每个输出点只是相应输入点和其邻域中其他点的加权和。内核只是一个描述这些权重的数组。在1D中,它只是:
y[n] = SUM x[n-k] . h[k]
k
其中h
是内核。通常,您可以为每个颜色通道单独计算。
一旦卷积工作,最难的问题是在图像的边缘做什么。有各种策略(例如零填充,扩展值,包装,镜像),但没有一个正确的答案;这取决于你的目标。
你没有解释“失败”是什么意思;结果完全是胡说八道,还是接近(在某个误差范围内)?如果是后者,那么你可能会成为浮点运算限制的牺牲品; Matlab可能会以稍微不同的顺序计算事物,导致不同的舍入效果。