【matlab图像处理】图像的算术运算实践

中国史之【推行国野制】:
国野制产生于周初的武力征服,是西周的社会等级制度。国是统治宗族聚居的城郭和郊区,野则是被征服者散居的鄙野。国人享有一定的权利,是周朝军队的主力。野人的义务则是农业生产,是井田制下的劳动者。
——来源:全历史APP

俗话说:“好记性不如烂笔头”,多写写多记记,总不会错。多一些不为什么的坚持,少一些功利主义的追求。

今天介绍图像的算术运算实践。单看课本知识,不去动手,难以体会到视觉效果的冲击感。本内容参考自《实用MATLAB图像和视频处理》第6章。

图像处理工具包中提供了4个函数用于进行图像算术运算,分别是imadd、imsubtract、immultiply、imdivide。工具包内的函数会自动处理溢出问题。

1、图像加法–imadd

图像加法可通过对每个像素值加一个常数值来使图像变亮。它也可以用来将两幅图像混合成一幅图像。编码如下:
在这里插入图片描述
首先,新建一个脚本,然后编写相关代码,然后点运行。这里我出现了错误,错误提示为“不支持将脚本imadd作为函数执行”,这是因为imadd是图像工具包的内置函数,所以我不能再命名我的脚本为imadd.m,需要重命名。我重命名为img_add.m,最终运行效果如下:
在这里插入图片描述
我们也可以使用imadd函数来混合两幅图像,代码和效果如下:

%使用函数imadd来对所有像素值加一个常数,以增亮一幅图像
I = imread('kobe.jpg');
I2 = imadd(I , 75);
figure
subplot(1,2,1), imshow(I), title('kobe');
subplot(1,2,2), imshow(I2), title('Brighter kobe');

%使用函数imadd来混合两幅图像
img1 = imread('kobe.jpg');
img2 = imread('star.jpg');
img3 = imadd(img1, img2);
figure
subplot(1,3,1), imshow(img1), title('kobe');
subplot(1,3,2), imshow(img2), title('star');
subplot(1,3,3), imshow(img3), title('kobe in star');

在这里插入图片描述
Respect to kobe。这效果还不错吧,就一句函数,学会图像处理,最直接的好处就是不需要再去学PS。

2、图像减法–imsubtract

图像减法和加法是类似的操作,它可以减去一个标量使图像变暗,也可以两幅图像相减,来找出他们之间的差异。这在于比较两幅图像是否相同时很有用。代码和效果如下:

%使用函数imsubtract来对所有像素值减一个常数,以变暗一幅图像
I = imread('star.jpg');
I2 = imsubtract(I , 75);
figure
subplot(1,2,1), imshow(I), title('star');
subplot(1,2,2), imshow(I2), title('Darker star');

%使用函数imsubtract来比较两幅图像
img1 = imread('kobe.jpg');
img2 = imread('star.jpg');
img3 = imsubtract(img1, img2);
figure
subplot(1,3,1), imshow(img1), title('kobe');
subplot(1,3,2), imshow(img2), title('star');
subplot(1,3,3), imshow(img3), title('kobe in star');

在这里插入图片描述
在这里插入图片描述

3、图像乘法–immultiply

图像乘法将两幅图像中具有相同坐标的像素值相乘。这可用在称为动态放缩的增亮过程中,相比对每个像素加个常数的操作,其变亮效果更加自然。其效果图如下:

%使用函数immultiply来动态放缩图像,以达到变亮效果
I = imread('moon.tif');
I2 = imadd(I , 50);
I3 = immultiply(I, 1.2);
figure
subplot(1,3,1), imshow(I), title('original image');
subplot(1,3,2), imshow(I2), title('normal brightening');
subplot(1,3,3), imshow(I3), title('dynamic scaling');

在这里插入图片描述
从上面的结果可以明显看出,如果只是单纯的对像素值加一个标量,其整个图片都会显得苍白(如中间图片所示)。如果使用动态放缩,它的增亮细节会更加清晰,对比度更好。

另外,图像乘法也可以产生一些特殊的效果,比如人工的3D外观。将一幅平坦的图像与梯度相乘就可以产生3D纹理表面的错觉。代码如下:

%使用函数immultiply来生成一个人工3D的行星
img1 = im2double(imread('earth1.tif'));
img2 = im2double(imread('earth2.tif'));
img3 = immultiply(img1, img2);
figure
subplot(1,3,1), imshow(img1), title('Planet Image');
subplot(1,3,2), imshow(img2), title('Gradient');
subplot(1,3,3), imshow(img3), title('3D Planet');

在这里插入图片描述
呃,其实3D效果并不是很明显。。

4、图像除法–imdivide

图像除法可用作动态放缩的翻转操作。当然,同样的效果可以使用函数immultiply实现。代码和效果如下:


%使用函数imdivide来动态放缩图像,以达到变暗效果
I = imread('moon.tif');
I2 = imdivide(I , 2);
I3 = immultiply(I, 0.5);
figure
subplot(1,3,1), imshow(I), title('original image');
subplot(1,3,2), imshow(I2), title('Darker w/ Division');
subplot(1,3,3), imshow(I3), title('Darker w/ Multiplication');

在这里插入图片描述
图像除法的另一个用途是从一幅图像中提取背景。这常用作一个复杂操作的预处理步骤。我们先看看要处理的文档图像如下:

notext = imread('gradient.tif');
text = imread('gradient_with_text.tif');
figure
imshow(text), title('original Image')

在这里插入图片描述
这幅图像可以代表一个文档,它是在不均匀的光照条件下扫描得到的。因为背景的缘故,这幅图像中的文字不能直接处理,即需要先对图像进行预处理,然后才能处理文字。

如果背景是均匀的,可使用阈值化来从背景中提取文字像素。阈值化是一种简单地将一幅图像转换成其二值图的过程。

比较好理解,就是定义一个阈值作为临界值,低于该阈值的像素被设置为全黑像素,而高于阈值的设置为全白像素。我们用代码验证一下可不可用阈值来解决这个问题。

%使用阈值来提取前背景
level = graythresh(text);
BW = im2bw(text, level);
figure, imshow(BW)

在这里插入图片描述
其效果如上,我们使用内置函数graythresh来设置一个阈值,但其并不能很好将文字和背景区分开,仅得到部分需要的文字。

如果我们有机会得到图片的背景图片,那么使用函数imdivide就可以提取出前景。在实际中(如扫描文档)得到这样的背景图像,有可能需要扫描一张仅有非均匀光照背景的黑纸。代码和效果如下:


%用图像除以背景来消除背景
fixed = imdivide(text, notext);
figure
subplot(1,3,1), imshow(text), title('original Image');
subplot(1,3,2), imshow(notext), title('Background Only');
subplot(1,3,3), imshow(fixed, []), title('Divided Image');

在这里插入图片描述
从上面的效果可以看到,如果我们拿到背景图后,可以很简单地图像相除即可得到清晰的文字内容。难就难在背景图不好得到。

以上是本期内容,建议自己动手来实践一下。如果需要图片和代码,可以关注公众号,回复关键字【matlab代码】即可获得。我会上传到云盘。

【声明】:学习笔记基于互联网上各种学习资源的个人整理。

以上是本期内容,下期介绍图像处理的逻辑运算实践。

我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我一起学习。

猜你喜欢

转载自blog.csdn.net/ling_xiobai/article/details/124231920