some studying matlab notes(reprinted)

由于工作需要,开始研究一下MATLAB图像处理相关的知识,图像处理只是matlab应用领域中小小的一部分而已。以前只是听说过MATLAB很强大,但没有系统的学过,如今开始学时,发现matlab确实很不错、很高大上。操作起来很方便,特别是编写程序时,比C语言更简洁。
很多人都是大学里就学过matlab的,由于是半路出家,所以知识不是很全面,直接拿了一本冈萨雷斯的MATLAB版的书就开始看,下面做一些简单的小记录。
1. matlab命令基础:

基础命令:
clc——清除窗口
clear——清除之前赋值过的变量
disp——打印信息,相当于echo
celldisp——打印元胞数组内容
who——简单的显示当前已有变量
whos——显示所有变量及详细内容 whos也可以指定显示某个变量
tan/sin/cos/log ——各种数学运算
…——用来续行
定义数组——x=1:100
定义矩阵——A=[1,1,2] A=[1 2 2]; 加分号表示不显示命令执行结果 定义空矩阵B=[]
矩阵转置——A=[1 3 5 7] B=A’ 或 B=A.’可以把行向量转换为列向量
取元素——A(1)取A中第一个元素 A(1:5)取A中第一到五的元素
A(1:end)取第1到最后的元素,产生一个行向量; A(:)产生一个列向量
A(1:2:end)表示步长为2 步长也可以为负值 如A(end:-2:1)
linspace——x=linspace(a,b,n)产生含有n个元素的行向量x n个元素线性隔开 并包含a和b
:的活用——A=[1 2 3; 4 5 6; 7 8 9] A(:,3)取整个第三列 A(1:2, 1:3) 取两行三列

+

—— 表示矩阵与矩阵相乘,满足线性代数上学的矩阵与矩阵的乘法,
.*表示矩阵中元素与元素相乘,这两个矩阵的维数必需相同。/和./也一样的道理

length/size/numel的用法:
length(x) ——返回x的长度 如果x是单个变量 返回1 如果x是矩阵 返回该矩阵行数与列数中的较大者。
size(x) ——当x是单个变量时,返回[1 1] 当x是矩阵是 返回矩阵的行数与列数 可以这样来接受[m n]=size(x)
numel(x) ——当x是单个变量时 返回1, 当x是矩阵时,返回矩阵元素总个数。
/

format compact——以紧凑方式显示
format loose ——以松散方式显示

mean函数:

如果有这样一个矩阵:A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];
用mean(A)(默认dim=1)就会求每一列的均值
ans =
3.0000 4.5000 6.0000

>>用mean(A,2)就会求每一行的均值 
ans =
    2.0000
    4.0000
    6.0000
    6.0000

mean(A(:)) 求总的平均值

其他函数:
zeros(M,N)——生成一个M*N的double型矩阵 元素均为0
ones(M,N)——生成一个M*N的double型矩阵 元素均为1
true(M,N)——生成一个M*N型的logical矩阵,元素均为1
false(M,N)——与上面的true相反
magic(M,N)——生成一个魔术幻阵
rand(M,N)——生成一个M*N的矩阵 元素大小在[0-1中均匀分布]
randn(M,N)——生成一个M*N的矩阵 矩阵元素正态分布 随机数均值是0 方差是1.

plot(X,Y)——画二维图像
subplot(m,n,p)——m代表生成图像的行数,n是列数,p代表子图编号
plot3(X,Y,Z)——画三维图
mesh(X,Y,Z)——画三维图
surf(X,Y,Z)——画三维图,并上色

matlab函数设计:
.m文件建立的函数文件
function [A, B] = fun(A, B) //输入A、B两个变量,返回A、B两个变量 一般.m文件名命名为函数名字
% xxxxxx 代表注释,在命令窗口中输入help fun可以显示这个注释
实例:

function [g,k,l] = two(x)
error(nargchk(1,1,nargin))
% error(nargchk(1,2,nargin))
if x<=1
    g = x;
end
g = 0;
k = nargin;
l = nargout;
for i=1:1:x
    g = g + i;
end

调用时写tow(10),就可以计算1~10的和。

匿名函数:
var = @(x)(x+1)
调用时形如var(1)即可,@后面跟参数列表

接受用户输入信息:
t = input(‘Enter you data:’, ‘s’);
t=’12.6, x2y, z’;
[a,b,c] = strread(t, ‘%f%q%q’, ‘delimiter’, ‘,’) //按指定的格式读入a b c

matlab中,图像大致分为二值图像(0/1)、灰度图像(0-255灰度级)、RGB图像(R、G、B三个分量 三个分量都相同时,所表示的颜色就退化为灰度)、索引图像。
灰度、亮度、强度通常是同一个概念。
所有图像按照特性分为位图和矢量图,位图常见格式:JPG GIF BMP矢量图:PNG
机器视觉又称计算机视觉,试图开发出一种模拟人眼的能力,能够理解自然景物与环境的系统,比较高级哦。

nargin将返回输入到函数的参数个数、nargout用于函数的输出
nargchk用于检查参数数目是否正确margchk(low, high, number),使用实例:
function G = test(X, Y)
error(nargchk(1,2,nargin));

Matlab写文本txt换行 :
matlab关于文本文件的操作函数基本都是继承C语言的,但存在一些细微的差别。
1.写txt换行的实现

方法一:

fid=fopen(‘filename.txt’,’w’);

fprintf(fid,’%d\r\n’,a);

fclose(fid);

方法二:

fid=fopen(‘filename.txt’,’wt’); %加t表示以文本文件模式(text mode)打开

fprintf(fid,’%d\n’,a);

fclose(fid);

说明,关于换行符还与操作系统有关!

  1. 在txt文本里接着写

C语言里打开时的命令是 fid=fopen(‘filename.txt’,’aw’);

而在matlab里则是fid=fopen(‘filename.txt’,’a’);

  1. 图像处理基础:

imread——读入图像A=imread(‘1.jpg’)
imshow——显示图像imshow(A, B); imshow(A, [low high]);
会将所有小于或等于low的值显示为黑色,大于或等于high的值显示为白色
若B省略,默认的灰度级是256,imshow(A, []) []表示将low设为A的最小值 将high设为A的最大值
显示多幅图像:imshow(A), figure,imshow(B)
imwrite——保存图像 imwrite(A, ‘2.jpg’)
imwrite(A, ‘2.jpg’, ‘quality’, q) // q在0-100之间(由于JPFG压缩 q越小图像退化越严重)
size(A)——显示图像的大小
imfinfo——显示图像的详细信息 imfinfo 1.jpg 也可以K=imfinfo(‘1.jpg’) 就可以使用K.Height K.Width等等信息
学会计算图像的压缩比:imgBytes=(K.Height*K.Width*K.BitDepth/8) compress_bytes=K.FileSize
imgBytes / compress_bytes ==压缩比
命令窗口输入:imfinfo test.jpg,显示信息如下:

ans = 

           Filename: 'C:\Documents and Settings\Administrator\My Documents\MATLAB\test.jpg'
        FileModDate: '30-Sep-2014 10:31:18'
           FileSize: 1609315
             Format: 'jpg'
      FormatVersion: ''
              Width: 2336
             Height: 1752
           BitDepth: 24
          ColorType: 'truecolor'
    FormatSignature: ''
    NumberOfSamples: 3
       CodingMethod: 'Huffman'
      CodingProcess: 'Sequential'
            Comment: {}

double/im2double/mat2gray的区别:
A=imread(‘1.jpg’);
A(1,1,:) ——显示A中第1行第一列像素点(包含红、绿、蓝)三个分量的值

    B=double(A)——转换为double类型 值不会变 注意 使用im2double值会[0-1]
    im2double   ——若输入是uint8类型 每个值会除以255. 
    mat2gray()   ——可以将double类型转换为归一化的double类型
    区别:
    im2double:如果输入类型是uint8、unit16 、logical,则按照0-->>0,255-->>1,将其值按比例处理成0~1之间的double数值;如果输入类型是double,输出没有处理;
    double:返回数值与输入相同的double类型矩阵;
    mat2gray:对输入进行归一化处理,最小值-->>0;最大值-->>1,输出类型为double。
    在实际的对图像处理过程中,由于我们读入图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此通常使用im2double函数将图像数据转换成双精度型数据。

注意:uint8类、uint16类RGB图像取值范围分别是[0, 255]、[0, 65535],而double类范围是[0, 1]
C=[-1,0.5; 2,3]
B=im2uint8(C)——im2uint8把所有大于1的值转换为255 小于0 的值转为0 其他值乘以255
im2bw ——得到二值图像 可以先A=mat2gray(B), im2bw(A, 0.5)

IPT支持的图像的算术函数:
imadd——图像相加
imsubtract——图像相减
immultiply——图像相乘
imdivide ——图像相除
imabsdiff——计算两幅图像之间的绝对差
imcomplement——对图像求补
imlincomb——计算两幅或多幅图像的线性组合

图像旋转函数:
imrotate,matlab默认是逆时针旋转, imrotate参数解释:
angle顾名思义 就是你旋转的角度, method 就是你实现旋转用的是什么方法,有三种 和后面的插值放大缩小是一下就是 最邻近插值法 双线性插值法 三次卷积插值法,英语表示就是 ‘nearest’ ‘bilinear’ ‘bicubic’。
不同的插值方法得到的旋转图像有细微的差别 如果你不选在 matlab默认的是最邻近插值法 那么图像会有一定的失真,这个失真主要是因为matlab在计算每个点的新坐标的时候得到的数值不是整数,要去整所造成的最后说说bbox 这个的意义主要分为2种,也就是说我们在这一项有2个选择 一个是‘loose’ 另外一个是‘crop’
loose 就是宽松的意思 顾名思义就是说 图像旋转后 系统会给予一个宽松的环境去匹配它,这样你得到的图片就是一个完整的图片
matlab的解释是 When BBOX is ‘loose’, B
includes the whole rotated image, which generally is larger than A.
crop 就是剪切啦,也就是困扰了大家很久的问题,为什么旋转后图像变小了,因为matlab默认的是crop 超过图片原来大小的部分被crop了

>> subplot(2,2,1)
>> imshow(A)
>> subplot(2,2,2)
>> imshow(imrotate(A, 30, 'bilinear', 'loose'));
>> subplot(2,2,3)
>> imshow(imrotate(A, 30, 'bilinear', 'crop'));
  1. 亮度变换与空间滤波:

  2. 亮度
    imadjust函数
    A=imread(‘1.jpg’);
    B= imadjust(A, [], [], 0.75); // gamma<1 变亮
    imshow(B)

    C=imadjust(A, [0 1], [1 0]);
    效果等价于C=imcomplement(A) 都是求图像的负片

  3. 对比度拉伸函数
    g = 1./(1+(m./(f+eps)).^E) // 加eps是为了防止溢出

  4. 直方图
    imhist函数:
    h = imhist(f, b) //b是灰度级个数 默认是256
    numel(f) //得到像素点个数
    B=rgb2gray(A); subplot(121), imshow(B); subplot(122), imhist(B);
    直方图均衡化:
    histeq函数:
    J=histeq(I)
    实例:

>> A=imread('test.jpg');
>> B=rgb2gray(A);
>> imhist(B);//显示直方图
>> figure;
>> imhist(histeq(B)) //显示均衡化后的直方图
>> C=histeq(B);
>> imwrite(C, 'xxx.jpg');

图像如下所示:
这里写图片描述
这里写图片描述
4. 空间滤波:
线性空间滤波:imfilter函数
g=imfilter(f,w,filtering_mode, boundary_options, size_options);
//filtering_mode=corr/conv size_options=same/full
通用语法为 g = imfilter(f, w, ‘replicate’);
非线性滤波:colfilt函数

IPT中的线性滤波器:
  fspecial函数用来生成滤波掩膜w
  w = fspecial('type', parm) //type表示滤波器类型
  type值可以是:average disk gaussian laplacian log motion prewitt sobel unsharp

实例:
使用拉普拉斯算子来增强图像,包括锐化,同时应该保留其灰度色调
test_shape.m

function [] = test_sharp(A)
% Test Sharp
B= im2double(A);
w= fspecial('laplacian', 0);//laplacian时 第二个参数默认是0.5
C= imfilter(B, w, 'replicate');
D= B-C;
imwrite(D, 'out.jpg');
最后对比A与C的效果  发现图像明显更为清晰了。。。
可以直接用unsharp选项,效果与上面的差不多
A=imread('test.jpg');
w = fspecial('unsharp')
B=im2double(A);
C=imfilter(B, w, 'replicate');
imwrite(C, 'out.jpg');

上面使用拉普拉斯算子产生的w=[0 1 0; 1 -4 1; 0 1 0]; 中心为-4,现在我们手工指定中心为-8的情况如下:

function [] = test_sharp(A)
w4 = fspecial('laplacian', 0);
w8 = [1 1 1; 1 -8 1; 1 1 1];
A = im2double(A);
A4 = A - imfilter(A, w4, 'replicate');
A8 = A - imfilter(A, w8, 'replicate');
imwrite(A4, '4.jpg');
imwrite(A8, '8.jpg');

会发现图像锐化效果更好,图像更清晰。

IPT中的非线性滤波器:
ordfilt2函数  g = ordfilt2(f, order, domain)
中值滤波medfilt2
图像中加入噪声:格式:J = imnoise(I, type, parm)
>> A=imread('test.jpg');
>> B = imnoise(A, 'salt & pepper', 0.02);
>> C=rgb2gray(B);
>> D=medfilt2(C, [3 3]);//中值滤波
>> imwrite(D, 'xxx.jpg')
  1. 彩色图像处理

A = imread(“test.jpg”);
%获取图像R、G、B每个分量
R = A(:,:,1);
G = A(:,:,2);
B = A(:,:,3);
D = cat(3, R, G, B); //cat组合成图像

clear
rgb=imread('xxx.jpg');
rgb_r=rgb(:,:,1);
rgb_g=rgb(:,:,2);
rgb_b=rgb(:,:,3);
[x y z]=size(rgb);
zero=zeros(x, y);
R=cat(3,rgb_r,zero,zero);
G=cat(3,zero,rgb_g,zero);
B=cat(3,zero,zero,rgb_b);
RGB=cat(3,rgb_r,rgb_g,rgb_b);
subplot(2,2,1),imshow(R),title('红色分量');
subplot(2,2,2),imshow(G),title('绿色分量');
subplot(2,2,3),imshow(B),title('蓝色分量');
subplot(2,2,4),imshow(RGB);
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值