目录
标量
手写函数
混合图片
标量
在前面的例子中,我们看到了如何通过数字划分图像。
>> dolhphin = imread('dolphin.png');
>> dolhphin / 2
除以2与乘以0.5相同。
>> dolphin * 0.5
写这两个的顺序也无关紧要。
>> 0.5 * dolphin
常数0.5称为标量,这可能是因为它缩放了图像的值。
让我们看看与原始图像相比结果如何:
将强度值减半,明显变暗。
请注意,我们可以乘以任意数字,甚至大于1。
将强度值乘以1.5可使图像更亮:
>> result = dolphin * 1.5;
>> imshow(resule);
运行结果:
我们在某些地方看到同样的褪色效果。这是由于高于255的图像值在该限制下被截断。
手写函数
在Octave中,我们可以编写一个函数来执行常见操作。
让我们把缩放变成一个函数。
>> function result = scale(img, value)
result = value .* img;
endfunction
我们通过输入单词function来编写函数,后面跟着返回值的变量名。
然后是等号,函数的名称和括号中的参数。
接下来是函数体。在这种情况下,我们希望结果是值和图像的乘积。
为了确保我们正在执行逐元素的乘法,让我们将" * "改为" .* "。
当其中一个值是标量时,这没有任何区别,但是当两个被乘的量是向量或矩阵时," * "和" .* "会产生不同的结果。
我们通过输入endfunction来结束这个功能。
让我们加载一个图像并尝试这个功能。
>> function result = scale(img, value);
value .* img;
endfunction
>>
>> dolphin = imread('dolphin.png');
>> dolphin_sc = scale(dolphin, 0.5);
>> imshow(dolphin);
>> imshow(dolphin_sc);
混合图片
在一起,并通过缩放器乘以图像强度值,让我们重新审视我们平均两个图像的例子。
我们看到除以2的除法可以重写为乘以0.5。
>> dolphin = imread('dolpthin.png');
>> bicycle = imread('bicycle.png');
>>
>> result = dolphin / 2 + bicycle / 2;
>> result = 0.5 * dolphin + 0.5 * bicycle;
现在,这导致图像具有相等的部分海豚和等量的自行车。
如果我们想改变这些比率怎么办?我们想要更多的海豚。
>> result = 0.75 * dolphin + 0.5 * bicycle;
强度值与原始图像相同,我们应该确保这些权重之和为1。通常,这被称为混合两个图像。
>> result = 0.75 * dolphin + 0.25 * bicycle;
让我们看看它的样子。
是的,我们确实从海豚图像中看到了更多的冲浪,但这有点难以辨别。
我们换一种稍微远一点的方式怎么样?
>> result = 0.85 * dolphin + 0.15 * bicycle;
更多海豚了。
我希望我们有一个函数来做这个,我们可以这样调用它。
你能帮我写这个功能吗?我来帮你。将代码放在函数体中。请记住,要返回一些内容,请将其分配给输出变量。
另请注意,a和b是要混合的两个图像,alpha是要应用于a的权重。
实现该功能后,使用不同的alpha值进行测试。
我们知道我们想要将A乘以α,并且由于一些权重需要为1,我们将B乘以α减去α。
>> funciton output = blend(a, b, alpha)
alpha * a + (1 - alpha) * b
endfunction
>>
>> dolphin = imread('dolphin.png');
>> bicycle = imread('bicycle.png');
>>
>> result = blend(dolphin, bicycle, 0.85);
>> imshow(result);
最后我们将它分配给输出变量,就这样,让我们看看我们得到了什么。
好的,和以前一样,现在看看改变混合权重是多么容易。
例如,我想要更少的海豚和更多的自行车。
>> result = blend(dolphin, bicycle, 0.25);
>> imshow(result);
好了。几乎看起来街上有水。
这种获取两个图像加权和的方法是alpha混合的基础。
——学会编写自己的代码,才能练出真功夫。