数字图像处理(一) matlab图像简单操作

来源:互联网 发布:拼人脸五官的软件 编辑:程序博客网 时间:2024/06/05 06:50
环境:matlab

之前一直在做一些枯燥的函数计算,没想到Matlab可以做图像处理,发现这个东西界面是用java写的,当你没配置matlab的jre环境时,看到一大堆swing的报错了没?用的是Matlab2007。
        

事实上计算机只是0和1的东西,所以一幅数字图像说到底就是0和1组成,先从灰度图像说起,:元素取值代表灰度级的矩阵。采用不同数据类型时取值范围:有uint8(8位数字图像数据类型),说回0和1,二进制,2的8次方,总共256种可能性,灰度级为[0, 255],  0是黑,255是白,虽然是“黑白图”,但是看上去有层次感,二值图像:元素取值为0或1的逻辑矩阵,这个才是真正的黑白,非黑即白,看到这里大家应该知道彩色图像,经常设置RGB。当然彩色的麻烦很多。


当然,位数越多,可能性就越多种,那么层次感就很强烈了。

f=imread('lina.jpg');   <span style="font-size:18px;"></span>

读入图像,matlab里面不加分号是代表执行语句不输出结果,加了分号自己用过


a=2;

一试不就知道了?

想看这幅图像由哪些数字组成,把第一条语句的分号去掉。


imshow(f)

展示出这幅图片,出了大问题:

显示全白,报错:

java.lang.NullPointerExceptionat com.mathworks.jmi.bean.MatlabBeanInterface.addCallback(MatlabBeanInterface.java:680)at com.mathworks.jmi.bean.MatlabCallbackInterface.addCallback(MatlabCallbackInterface.java:128)

实验证明google比较强。当时想下载一个新的matlab,几G,回头还是找别的解决办法,发现环境变量的MATLAB_JAVA配置的jre是1.7版本,灵光一闪改成自己的IDE里面自带的JRE。

找到自己eclipse的jdk安装路径,是有自带的,像myeclipse的有D:\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013,把这个配置好,图像正常显示,昨晚就郁闷了,图片剪切不了。




>> whos f  Name        Size              Bytes  Class    Attributes  f         362x550            199100  uint8         

和linux类似,whosiam有这种指令,上述的图像数据类型为uint8的灰度图像,如果把它变成二值图像,利用
>> g = im2uint8(f);>> imshow(g)
便成了一幅黑白图像。



图像翻转:


fp = f(end:-1:1, :);
对矩阵的处理有一个精彩的回答,引自http://zhidao.baidu.com/question/333655937.html

一个矩阵括号里逗号用于间隔不同维度
比如A为一维向量,A(1)就表示第一个元素
如果A为二维矩阵,那么需要A(m,n)表示第m行,第n列矩阵,若是有冒号,比如A(:,n)就表示那些列数为n,行数为任意的所有制,即去矩阵第n列,相应A(m,:)表示去A的第m行所有元素
再来看A(end:-1:1,:),同样逗号前表示行,后表示列,列的部分为冒号,表示列数任意,也就是对A整行整行进行操作;逗号前,end表示最后一行,1表示第1行,-1表示从后到前倒着取出A的整列(这里错了,应该为整行),一般情况下我们顺序来使用,比如A(2:1:end,:)表示从A第二行取到最后一行,1表示取行时的间隔,若A(2:2:end,:),表示每两行取一行,就是2 4 6行下去到end。


同样的道理,截取图像也是一样:

>> part = f(122:322,122:322);>> imshow(part);
从122行到322行,122列到322列。

      最简单的东西,改一下图像的数字,你能把它变成黑一块白一块,接下来,还会介绍位图的东西,图像是一层一层的,其中有一层是对原图影响最小的,然后,你就可以把你的情书嵌入到你女朋友或者男朋友的照片里。就是水印吧。

   接下来会用自己学的东西,本来想用java做个界面,结合这个,进行图片的嵌入和解析。发现两者的结合很麻烦,报了一大堆的错