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图像.
使用卷积实现简单图像滤波器.每个输出点只是相应输入点和其邻域中其他点的加权和.内核只是一个描述这些权重的数组.在1D中,它只是:
y[n] = SUM x[n-k] . h[k]
k
Run Code Online (Sandbox Code Playgroud)
h
内核在哪里 通常,您可以为每个颜色通道单独计算.
一旦你进行了卷积处理,最难的问题是在图像的边缘做什么.有各种策略(例如零填充,扩展值,包装,镜像),但没有一个正确的答案; 这取决于你的目标是什么.
你没有解释"失败"是什么意思; 结果是完全废话,还是接近(在一些误差范围内)?如果是后者,那么你可能会成为浮点运算限制的牺牲品; Matlab可能会以稍微不同的顺序计算事物,导致不同的舍入效果.
归档时间: |
|
查看次数: |
86 次 |
最近记录: |