赞
踩
这篇文章我会着重去写15个功能点要求以外的内容,主要包括摄像头拍照;图像叠加,相减等功能的小技巧;示波器;带阻滤波和同态滤波。全部内容的源码放在了最后。
摄像拍照
- imaqhwinfo%显示摄像头信息
- vid = videoinput('winvideo',1,'YUY2_640x480');%adaptorname、deviceID、format
- %deviceID不设置,系统自动寻找可用设备,format是视频格式
-
- set(vid, 'FramesPerTrigger', 1);%特定帧数显示预览效果
- set(vid, 'TriggerRepeat', Inf);%触发时间
- set(vid,'ReturnedColorSpace','rgb');%图像色彩域定义为RGB
-
- hf = figure('Units', 'Normalized', 'Menubar', 'None','NumberTitle', 'off', 'Name', '实时拍照系统');%定义窗口
- ha = axes('Parent', hf, 'Units', 'Normalized', 'Position', [0.1 0.17 0.8 0.8]);%定义展示预览的axes区域
- axis off
- %定义两个按钮控件的位置与功能
- %VideoResolution,图像分辨率
-
- hb1 = uicontrol('Parent', hf, 'Units', 'Normalized','Position',...
- [0.25 0.02 0.2 0.1], 'String', '预览', 'Callback', ['vidRes = get(vid, ''VideoResolution'');' ...
- 'nBands = get(vid, ''NumberOfBands'');' ...%色彩数目
- 'hImage = image(zeros(vidRes(2), vidRes(1), nBands));' ...%视频预览窗口对应的句柄
- 'preview(vid, hImage);']);
- hb2 = uicontrol('Parent', hf, 'Units', 'Normalized','Position',...
- [0.55 0.02 0.2 0.1], 'String', '拍照', 'Callback', ['imwrite(getsnapshot(vid), ''im.jpg'');'...
- 'img=(getsnapshot(vid));'...%getsnapshot 获取图像即拍摄
- 'image(img);'...
- %image(C) 会将数组 C 中的数据显示为图像。
- %C 的每个元素指定图像的 1 个像素的颜色。
- %生成的图像是一个 m×n 像素网格,其中 m 和 n 分别是 C 中的行数和列数。
- %这些元素的行索引和列索引确定了对应像素的中心。
- 'imshow(img);']);
-
效果是这样的
更详细的解释参考这个链接https://www.freesion.com/article/24761412909/
图像叠加的小技巧,一次可以选择两张图片,显示在一个axes内
核心代码是这样的
- [file,path] = uigetfile('*.*','请选择图片','multiselect','on','.\'); %multselect就是可以选择多张图片
- if isa(file,'char')%如果选择单张,file就是char
- file_path=fullfile(path,file);
- img=imread(file_path);
- image1=[handles.img,img];
- axes(handles.g1);
- imshow(image1);
-
- end
- if length(file)==2%如果选择两张,file就是数组
- file_path=fullfile(path,file);
- img=imread(file_path{1, 1});%读取数组元素
- img2=imread(file_path{1, 2});
- image1=[img,img2];%将两个图像放入一个矩阵中
- axes(handles.g1)
- imshow(image1);%显示拼合的图像
- end
效果图
示波器
- r=handles.img(:,:,1);%分别取出三个通道的图像
- g=handles.img(:,:,2);
- b=handles.img(:,:,3);
- x=size(r);
- x=(1:x(1,2));%x(:)是为了将信号转换为一段连续的向量
- r=r(1,:);
- g=g(1,:);
- b=b(1,:);%b(:,1)表示矩阵b的第一列所有元素
- axes(handles.g4);
- cla;
- plot(x,r,'r');%坐标点为圆圈标志,且线型为红色短划线的绘图样式
- hold on
- plot(x,g,'g'); %坐标点为圆圈标志,且线型为绿色短划线的绘图样式
- plot(x,b,'b');%坐标点为圆圈标志,且线型为蓝色短划线的绘图样式
- hold off;
-
- ImageData1 = reshape(handles.img(:,:,1), [size(handles.img, 1) * size(handles.img, 2) 1]);%重构数组,单个通道与图像大小
- ImageData2 = reshape(handles.img(:,:,2), [size(handles.img, 1) * size(handles.img, 2) 1]);
- ImageData3 = reshape(handles.img(:,:,3), [size(handles.img, 1) * size(handles.img, 2) 1]);
- [H1, X1] = hist(ImageData1, 1:5:256);%直方图
- [H2, X2] = hist(ImageData2, 1:5:256);
- [H3, X3] = hist(ImageData3, 1:5:256);
- axes(handles.g5);
- cla;
- hold on;
- plot(X1, H1, 'r');%三条曲线合并
- plot(X2, H2, 'g');
- plot(X3, H3, 'b');
- axis([0 256 0 max([H1 H2 H3])]);%设置范围,横轴0-256,纵轴0-max([H1 H2 H3](最大直方图)
带阻滤波
知识点参考这两个链接
http://www.360doc.com/content/22/0222/10/73571518_1018491236.shtml
https://blog.csdn.net/weixin_43249038/article/details/118651303
- I=imnoise(I,'gaussian',0,0.01);
- I=im2double(I);
- M=2*size(I,1);%滤波器行数
- N=2*size(I,2);%滤波器列数
- u=-M/2:(M/2-1);
- v=-N/2:(N/2-1);
- [U,V]=meshgrid(u,v);
- D=sqrt(U.^2+V.^2);
- D0=50;%滤波器D0
- W=30;%滤波器带宽
- H=double(or(D<(D0-W/2),D>D0+W/2));
- J=fftshift(fft2(I,size(H,1),size(H,2)));
- K=J.*H;
- L=ifft2(ifftshift(K));
- L=L(1:size(I,1),1:size(I,2));
- handles.img=L;
- axes(handles.g2);
- cla;
- imshow(handles.img);
同态滤波
代码参考https://blog.csdn.net/m0_38127487/article/details/124161612
知识点参考https://blog.csdn.net/qq_40608730/article/details/105806085
- I=handles.img;
- J=log(im2double(I)+1);
- K=fft2(J);
- n=5;
- D0=0.1*pi;
- rh=0.7;
- rl=0.4;
- [row, column]=size(J);
- for i=1:row
- for j=i:column
- D1(i,j)=sqrt(i^2+j^2);
- H(i,j)=rl+(rh/(1+(D0/D1(i,j))^(2*n)));
- end
- end
- L=K.*H;
- M=ifft2(L);
- N=exp(M)-1;
- handles.img=N;
- axes(handles.g2);
- cla;
- imshow(handles.img);
源码资源https://download.csdn.net/download/weixin_53034267/87123658?spm=1001.2014.3001.5503
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。