多语言展示
当前在线:180今日阅读:126今日分享:42

基于Mathematica的图像变成黑白图片的算法原理

图像变成黑白图片的方法很多,但是,不同的方法,获得的效果是不同的。下面,我就介绍几个用Mathematica把图像变成黑白图片的具体方法。原图如下,是一个RGB色彩的PNG图片,但图片背景是透明的。
工具/原料
1

电脑

2

Mathematica

方法/步骤
1

把图片黑白化,最粗略的方法,就是图像二值化。Binarize[img]白色变白,黑色变黑,但是,透明的背景却变成了不透明的黑色。

2

把图中大于等于0.66的值,用1代替,否则用0代替。Binarize[img,0.66]

3

然而,上面的所谓的图img的数值,并不是指像素的数值,这可以通过下面的试验确定出来:f[x_]:=If[x<0.66,0,1]Attributes[f]={Listable};(f[#]&/@(img//ImageData))//Image上面的自定义函数f的作用,是把小于0.66的数字用0代替,否则用1代替;Attributes[f]={Listable};为函数f赋予了Listable的属性;用f作用于img对应的图片数据的每一个数值,得到新的图片数据,再转化为图片。此时,我们会得到黑白图吗?结果如下。

4

原因很简单,img是三通道的图片,任意像素都有三个不同的像素值,而这三个像素值并不一定同时大于或小于0.66。这从三个通道的灰度图可以看出来:(Image[ImageData[img][[All,All,#]]])&/@{1,2,3}下面三幅图,分别是R、G、B三个通道对应的灰度图,颜色越黑,对应的色彩在原图里越深。

5

上面也为我们提供了一个得到黑白图的方法,那就是分离图片的通道,计算机就会把彩色图转化为灰度图,这其实也是黑白图。于是,我们可以这样考虑:img0=Table[Mean/@(data=ImageData[img])[[n]],{n,1,data//Length,1}]//Image取每一个像素的三个数值的平均值,就得到一个单通道图。

6

如果上面的f作用于此时的图片,就会得到下图:(f[#]&/@(img0//ImageData))//Image

7

这和Binarize[img0,0.66]的效果,好像是一样的。

注意事项
1

单通道图片都是灰度图,那么,能不能给单通道图片着色呢,比如深浅不同的红色。

2

二通道图像会是彩色的吗?

3

为什么透明的背景,二值化之后会变成黑色?

4

怎么用计算机判断,两幅图是否完全相同?

推荐信息