matlab图像处理问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab图像处理问题相关的知识,希望对你有一定的参考价值。
我想循环处理我在F盘trans里面的照片,现在有俩个程序,帮我把这两个程序连接起来,能运行出结果
close all
clear all
clc
I = imread('IMG_0146.JPG');
[Ix,Iy,Iz]=size(I);
if Ix>400&Iy>300
I=imresize(I,[400,Iy*400/Ix],'nearest');
end
figure
imshow(I)%输出图像
title('normal image')
I=double(I); %将I转换成double类型
[hue,s,v]=rgb2hsv(I); %将RGB格式转换成HSV格式
cb=0.148*I(:,:,1)-0.291*I(:,:,2)+0.439*I(:,:,3)+128;%将RGB转换为YCrCb格式
cr=0.439*I(:,:,1)-0.368*I(:,:,2)-0.071*I(:,:,3)+128;
[w h]=size(I(:,:,1)); %获取转化后的I图像
for i=1:w
for j=1:h
if 145<=cr(i,j)&cr(i,j)<=165&145<=cb(i,j)&cb(i,j)<=180&0.01<=hue(i,j)&hue(i,j)<=0.15
segment(i,j)=1;
else
segment(i,j)=0;
end
end
end
figure
imshow(segment);
skin=segment;
% 去除小像素联通区域
skin=bwareaopen(skin,round(w*h/900));
%dilating
se=strel('square',5);创建结构区域
skin=imdilate(skin,se); %膨胀作用
im(:,:,1)=I(:,:,1).*skin;
im(:,:,2)=I(:,:,2).*skin;
im(:,:,3)=I(:,:,3).*skin;
figure
imshow(uint8(im));
title('skin areas')
BW = skin;
L = bwlabel(BW,8);%
BB = regionprops(L, 'BoundingBox');%L等于几对应几
BB1=struct2cell(BB);%转换结构bb到bb1里
BB2=cell2mat(BB1);
figure,imshow(uint8(I));
title('result image');
[s1 s2]=size(BB2);
for k=3:4:s2-1
if (BB2(1,k)/BB2(1,k+1)) < 1.8 &&....
(BB2(1,k)/BB2(1,k+1)) > 0.4 &&....
(BB2(1,k)*BB2(1,k+1)) > 1000
hold on;
rectangle('Position',[BB2(1,k-2),BB2(1,k-1),BB2(1,k),BB2(1,k+1)],'EdgeColor','r' )%指定位置添加矩形
end
end
还有一个
mov = VideoReader('C:\Users\Administrator\Desktop\shipin.avi');
fnum = mov.NumberOfFrames;%
for i = 1:5:fnum
frame = read(mov, i);
imshow(frame);
imwrite(frame,strcat('F:\转换图片\',num2str(i),'.jpg'),'jpg');
end
你后面的那个是每隔5帧截取一张图片储存并以i命名。
想要连接起来其实比较简单的,就是在处理图片处加一个大的for循环就可以了。
把视频程序放前面。截图储存后再读取处理,这里要注意的是你每隔5帧截一个图片,是不是有点太频了?还有弄个短点的视频,5秒左右。这样不会太浪费计算机资源,如果太大了可能会蓝屏或者死机哦。
其实,连在一起很简单的。就这样;(我在我机子上运行了一次,储存地址改了,你自己改回来吧)
clc;clear all;close all;
mov = VideoReader('C:\Users\epwqe_000\Desktop\MatlabAsa\sssss.avi');%改地址
fnum = mov.NumberOfFrames;%
for i = 1:5:fnum
frame = read(mov, i);
imshow(frame);
imwrite(frame,strcat('C:\Users\epwqe_000\Desktop\MatlabAsa\New Folder\',num2str(i),'.jpg'),'jpg');%改地址
img=strcat(num2str(i),'.jpg');
I = imread(img);
[Ix,Iy,Iz]=size(I);
if Ix>400&Iy>300
I=imresize(I,[400,Iy*400/Ix],'nearest');
end
figure
imshow(I)%输出图像
title('normal image')
I=double(I); %将I转换成double类型
[hue,s,v]=rgb2hsv(I); %将RGB格式转换成HSV格式
cb=0.148*I(:,:,1)-0.291*I(:,:,2)+0.439*I(:,:,3)+128;%将RGB转换为YCrCb格式
cr=0.439*I(:,:,1)-0.368*I(:,:,2)-0.071*I(:,:,3)+128;
[w h]=size(I(:,:,1));%获取转化后的I图像
for i=1:w
for j=1:h
if 145<=cr(i,j)&cr(i,j)<=165&145<=cb(i,j)&cb(i,j)<=180&0.01<=hue(i,j)&hue(i,j)<=0.15
segment(i,j)=1;
else
segment(i,j)=0;
end
end
end
figure
imshow(segment);
skin=segment;
% 去除小像素联通区域
skin=bwareaopen(skin,round(w*h/900));
%dilating
se=strel('square',5);%创建结构区域
skin=imdilate(skin,se); %膨胀作用
im(:,:,1)=I(:,:,1).*skin;
im(:,:,2)=I(:,:,2).*skin;
im(:,:,3)=I(:,:,3).*skin;
figure
imshow(uint8(im));
title('skin areas')
BW = skin;
L = bwlabel(BW,8);%
BB = regionprops(L, 'BoundingBox');%L等于几对应几
BB1=struct2cell(BB);%转换结构bb到bb1里
BB2=cell2mat(BB1);
figure,imshow(uint8(I));
title('result image');
[s1 s2]=size(BB2);
for k=3:4:s2-1
if (BB2(1,k)/BB2(1,k+1)) < 1.8 &&....
(BB2(1,k)/BB2(1,k+1)) > 0.4 &&....
(BB2(1,k)*BB2(1,k+1)) > 1000
hold on;
rectangle('Position',[BB2(1,k-2),BB2(1,k-1),BB2(1,k),BB2(1,k+1)],'EdgeColor','r' )%指定位置添加矩形
end
end
end 参考技术A 前提:把图像的名字都命名为“1.jpg”的形式,依次往后,然后把程序中的路径改对,然后才可以允许下面的程序(已测试,可以运行)。
fnum=8;%相片数量
for i = 1:fnum
picname=strcat('C:/Users/printer/Desktop/tes/',num2str(i),'.jpg');
I = imread(picname);
figure;imshow(I);
[Ix,Iy,Iz]=size(I);
if Ix>400&Iy>300
I=imresize(I,[400,Iy*400/Ix],'nearest');
end
figure
imshow(I)%输出图像
title('normal image')
I=double(I); %将I转换成double类型
[hue,s,v]=rgb2hsv(I); %将RGB格式转换成HSV格式
cb=0.148*I(:,:,1)-0.291*I(:,:,2)+0.439*I(:,:,3)+128;%将RGB转换为YCrCb格式
cr=0.439*I(:,:,1)-0.368*I(:,:,2)-0.071*I(:,:,3)+128;
[w h]=size(I(:,:,1)); %获取转化后的I图像
for i=1:w
for j=1:h
if 145<=cr(i,j)&cr(i,j)<=165&145<=cb(i,j)&cb(i,j)<=180&0.01<=hue(i,j)&hue(i,j)<=0.15
segment(i,j)=1;
else
segment(i,j)=0;
end
end
end
figure
imshow(segment);
skin=segment;
% 去除小像素联通区域
skin=bwareaopen(skin,round(w*h/900));
%dilating
se=strel('square',5);%创建结构区域
skin=imdilate(skin,se); %膨胀作用
im(:,:,1)=I(:,:,1).*skin;
im(:,:,2)=I(:,:,2).*skin;
im(:,:,3)=I(:,:,3).*skin;
figure
imshow(uint8(im));
title('skin areas')
BW = skin;
L = bwlabel(BW,8);%
BB = regionprops(L, 'BoundingBox');%L等于几对应几
BB1=struct2cell(BB);%转换结构bb到bb1里
BB2=cell2mat(BB1);
figure,imshow(uint8(I));
title('result image');
[s1 s2]=size(BB2);
for k=3:4:s2-1
if (BB2(1,k)/BB2(1,k+1)) < 1.8 &&....
(BB2(1,k)/BB2(1,k+1)) > 0.4 &&....
(BB2(1,k)*BB2(1,k+1)) > 1000
hold on;
rectangle('Position',[BB2(1,k-2),BB2(1,k-1),BB2(1,k),BB2(1,k+1)],'EdgeColor','r' )%指定位置添加矩形
end
end
close;
end
matlab处理循环特别慢的问题
用matlab进行PAPR的仿真,里面有两个for循环语句,运行起来特别慢。5分钟一点动静没有,CPU使用率100%。想问一下,这与电脑配置有没有关系?就是说如果用一个配置比较好的电脑运行会不会有帮助呢,还是说这是matlab本身的缺陷,与电脑无关?
与电脑有关的,高配置的电脑当然运行快,但是应该从程序本身解决问题,你说用了两个for循环就这样,应该是循环内部代码的问题或者是循环处理的数据太大,建议修改程序 参考技术A matlab尽管本身具有处理循环的能力,但是它的内部机制对于循环的支持并不好,执行速度会比较慢。要解决这个问题,解决方法有:
1、采用向量方式对数据进行处理。
2、采用C语言与Matlab的混合编程。
参考技术B matlab本身处理循环很慢 ,建议用C
或者把循环变成矩阵操作,matlab对于矩阵操作有独特的优势 参考技术C matlab处理for循环较慢,建议改用C或者用矩阵的形式计算会快
以上是关于matlab图像处理问题的主要内容,如果未能解决你的问题,请参考以下文章