MATLAB 전경 도 절단 및 박스 그림 표시 실현 절차
원본 그림:
절단 효과:
다음은 절단 부분 절차 입 니 다.
이 그림 을 예 로 들 면 그림 형식 hdr,jpg 등 이 다 됩 니 다.
1.1 가장자리 제거
일부 전경 도 는 흰색 과 회색 의 가장 자 리 를 가지 고 직접 절단 하면 다음 과 같은 효과 가 나타난다.
이때 우 리 는 먼저 원 도 를 흰색 으로 제거 해 야 한다.코드 는 다음 과 같다.
oriPic=imread('test.hdr');
[rows,cols,~]=size(oriPic);
for i=cols:-1:1
tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)
oriPic(:,i,:)=[];
else
break;
end
end
oriPic=oriPic(:,end:-1:1,:);
for i=size(oriPic,2):-1:1
tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)
oriPic(:,i,:)=[];
else
break;
end
end
oriPic=oriPic(:,end:-1:1,:);
for i=rows:-1:1
tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)
oriPic(i,:,:)=[];
else
break;
end
end
oriPic=oriPic(end:-1:1,:,:);
for i=size(oriPic,1):-1:1
tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)
oriPic(i,:,:)=[];
else
break;
end
end
oriPic=oriPic(end:-1:1,:,:);
1.2 그림 자 르 기우리 가 완성 해 야 할 것 은 바로 다음 과 같은 변환 과 재단 이다.
이 부분 은 사실 비교적 성숙 한 원리 와 코드 가 있다.
코드 참조:https://stackoverflow.com/questions/29678510/convert-21-equirectangular-panorama-to-cube-map
원리 참조:
http://paulbourke.net/panorama/cubemaps/#1
http://paulbourke.net/panorama/cubemaps/
원 리 는 글 에서 더욱 뚜렷 한 변화 도 를 참고 한다.
다른:
참고 코드 를 바탕 으로 맵 픽 셀 을 삽입 값 으로 처리 하면 그림 을 더욱 부 드 럽 게 할 수 있 습 니 다.원 리 는 다음 과 같 습 니 다.
주요 함수 코드:
function resultPic=createCubeMapFace(oriPic,id,height,width)
[M,N,~]=size(oriPic);
resultPic=zeros([height,width,3]);
an=sin(pi/4);
ak=cos(pi/4);
faceTransform=[0,0;
pi/2,0;
pi,0;
-pi/2,0;
0,-pi/2;
0,pi];
ftu=faceTransform(id,1);
ftv=faceTransform(id,2);
for y=0:height-1
for x=0:width-1
nx=y/height-0.5;
ny=x/width-0.5;
nx=nx*2*an;
ny=ny*2*an;
if (ftv == 0)
u=atan2(nx, ak);
v=atan2(ny*cos(u),ak);
u=u+ftu;
elseif(ftv>0)
d=sqrt(nx*nx+ny*ny);
v=pi/2-atan2(d,ak);
u=atan2(ny,nx);
else
d=sqrt(nx*nx+ny*ny);
v=-pi/2+atan2(d,ak);
u=atan2(-ny,nx);
end
u=u/(pi);
v=v/(pi/2);
while(v<-1)
v=v+2;
u=u+1;
end
while(v>1)
v=v-2;
u=u+1;
end
while(u<-1)
u=u+2;
end
while(u>1)
u=u-2;
end
u=u/2+0.5;
v=v/2+0.5;
u=u*(N-1)+1;
v=v*(M-1)+1;
fv=floor(v);fv1=floor(v)+1;pv=v-fv;fv1(fv1>M)=M;
fu=floor(u);fu1=floor(u)+1;pu=u-fu;fu1(fu1>N)=N;
resultPic(x+1,y+1,:)=double(oriPic(fv,fu,:)).*(1-pv).*(1-pu)+...
double(oriPic(fv1,fu,:)).*(pv).*(1-pu)+...
double(oriPic(fv,fu1,:)).*(1-pv).*(pu)+...
double(oriPic(fv1,fu1,:)).*(pv).*(pu);
end
end
resultPic=uint8(resultPic);
end
함수 호출 및 이미지 저장 소:여기 뒤의 길이 와 너비 수 치 는 임의로 설정 할 수 있 지만 길이 와 너비 수치 가 일치 해 야 합 니 다.현재 쓰기 에 따라 결 과 는 result 폴 더 에 저 장 됩 니 다.
if ~exist('result','dir')
mkdir('result');
end
for i=1:6
resultPic=createCubeMapFace(oriPic,i,500,500);
figure(i)
imshow(resultPic)
imwrite(resultPic,['result\',num2str(i),'.jpg'])
end
그림 참조그림 번호[1,2,3,4,5,6]는 각각 그림[오른쪽,후,왼쪽,앞,위,아래]에 대응 합 니 다.
1.3 전체 코드
function panoramic2box
oriPic=imread('889027-884424860.jpg');
[rows,cols,~]=size(oriPic);
for i=cols:-1:1
tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)
oriPic(:,i,:)=[];
else
break;
end
end
oriPic=oriPic(:,end:-1:1,:);
for i=size(oriPic,2):-1:1
tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);
if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)
oriPic(:,i,:)=[];
else
break;
end
end
oriPic=oriPic(:,end:-1:1,:);
for i=rows:-1:1
tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)
oriPic(i,:,:)=[];
else
break;
end
end
oriPic=oriPic(end:-1:1,:,:);
for i=size(oriPic,1):-1:1
tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);
if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)
oriPic(i,:,:)=[];
else
break;
end
end
oriPic=oriPic(end:-1:1,:,:);
% =========================================================================
if ~exist('result','dir')
mkdir('result');
end
for i=1:6
resultPic=createCubeMapFace(oriPic,i,500,500);
figure(i)
imshow(resultPic)
imwrite(resultPic,['result\',num2str(i),'.jpg'])
end
% =========================================================================
function resultPic=createCubeMapFace(oriPic,id,height,width)
[M,N,~]=size(oriPic);
resultPic=zeros([height,width,3]);
an=sin(pi/4);
ak=cos(pi/4);
faceTransform=[0,0;
pi/2,0;
pi,0;
-pi/2,0;
0,-pi/2;
0,pi];
ftu=faceTransform(id,1);
ftv=faceTransform(id,2);
for y=0:height-1
for x=0:width-1
nx=y/height-0.5;
ny=x/width-0.5;
nx=nx*2*an;
ny=ny*2*an;
if (ftv == 0)
u=atan2(nx, ak);
v=atan2(ny*cos(u),ak);
u=u+ftu;
elseif(ftv>0)
d=sqrt(nx*nx+ny*ny);
v=pi/2-atan2(d,ak);
u=atan2(ny,nx);
else
d=sqrt(nx*nx+ny*ny);
v=-pi/2+atan2(d,ak);
u=atan2(-ny,nx);
end
u=u/(pi);
v=v/(pi/2);
while(v<-1)
v=v+2;
u=u+1;
end
while(v>1)
v=v-2;
u=u+1;
end
while(u<-1)
u=u+2;
end
while(u>1)
u=u-2;
end
u=u/2+0.5;
v=v/2+0.5;
u=u*(N-1)+1;
v=v*(M-1)+1;
fv=floor(v);fv1=floor(v)+1;pv=v-fv;fv1(fv1>M)=M;
fu=floor(u);fu1=floor(u)+1;pu=u-fu;fu1(fu1>N)=N;
resultPic(x+1,y+1,:)=double(oriPic(fv,fu,:)).*(1-pv).*(1-pu)+...
double(oriPic(fv1,fu,:)).*(pv).*(1-pu)+...
double(oriPic(fv,fu1,:)).*(1-pv).*(pu)+...
double(oriPic(fv1,fu1,:)).*(pv).*(pu);
end
end
resultPic=uint8(resultPic);
end
end
1.4 기타 몇 조 의 절단 결과그림 원본:https://www.cgmodel.com/article/9004.html
파 트 2 박스 그림 전시
2.1 곡면 그리 기
surf 를 사용 하여 각 곡면 을 그립 니 다.그리고 각 곡면 에 스티커 를 붙 입 니 다.
for i=1:6
oriPic.(['p',num2str(i)])=imread(['result\',num2str(i),'.jpg']);
end
[rows,cols,~]=size(oriPic.p1);
[baseXY,baseZ]=meshgrid(1:cols,rows:-1:1);
ax=gca;hold(ax,'on')
surf(baseXY(:,end:-1:1)-(1+rows)/2,-(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p1,'EdgeColor','none','FaceColor','interp')
surf(-(rows-1)./2.*ones(size(baseXY)),baseXY-(1+rows)/2,baseZ,'CData',oriPic.p2,'EdgeColor','none','FaceColor','interp')
surf(baseXY-(1+rows)/2,(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p3,'EdgeColor','none','FaceColor','interp')
surf((rows-1)./2.*ones(size(baseXY)),baseXY(:,end:-1:1)-(1+rows)/2,baseZ,'CData',oriPic.p4,'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,ones(size(baseXY)),'CData',oriPic.p6(end:-1:1,end:-1:1,:),'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,rows-1+ones(size(baseXY)),'CData',oriPic.p5(:,end:-1:1,:),'EdgeColor','none','FaceColor','interp')
2.2 시각 조정
axes 속성 을 설정 하여 상자 안 으로 시각 을 조정 합 니 다.
ax=axes('parent',fig,'position',[-0.45 -0.45 1.9 1.9]);hold(ax,'on')
ax.ZLim=[0,rows+1];
ax.XLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.YLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.Color=[0 0 0];
ax.CameraPosition=[0,0,rows/2];
ax.CameraPositionMode='manual';
ax.DataAspectRatio=[1,1,1];
ax.DataAspectRatioMode='manual';
ax.Projection='perspective';
ax.CameraTargetMode='manual';
ax.CameraViewAngle = 7;
ax.View=[-2.7391 90.0000];
ax.CameraTarget=[0 0 (rows-1)/2];
ax.Toolbar.Visible='on';
실행 후 그 세 분 의 회전 버튼 을 누 르 면 로 밍 을 시작 할 수 있 습 니 다.이때 의 상자 그림 은 틈새 가 없 는 버 전 으로 틈새 가 있 는 버 전 은 뒤에 놓 습 니 다.
2.3 전체 코드
틈새 없 는 판:
function showBox
for i=1:6
oriPic.(['p',num2str(i)])=imread(['result\',num2str(i),'.jpg']);
end
[rows,cols,~]=size(oriPic.p1);
[baseXY,baseZ]=meshgrid(1:cols,rows:-1:1);
fig=figure('units','pixels','position',[300 80 500 500],...
'Numbertitle','off','menubar','none','resize','off',...
'name','box');
ax=axes('parent',fig,'position',[-0.45 -0.45 1.9 1.9]);hold(ax,'on')
ax.ZLim=[0,rows+1];
ax.XLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.YLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.Color=[0 0 0];
ax.CameraPosition=[0,0,rows/2];
ax.CameraPositionMode='manual';
ax.DataAspectRatio=[1,1,1];
ax.DataAspectRatioMode='manual';
ax.Projection='perspective';
ax.CameraTargetMode='manual';
ax.CameraViewAngle = 7;
ax.View=[-2.7391 90.0000];
ax.CameraTarget=[0 0 (rows-1)/2];
ax.Toolbar.Visible='on';
surf(baseXY(:,end:-1:1)-(1+rows)/2,-(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p1,'EdgeColor','none','FaceColor','interp')
surf(-(rows-1)./2.*ones(size(baseXY)),baseXY-(1+rows)/2,baseZ,'CData',oriPic.p2,'EdgeColor','none','FaceColor','interp')
surf(baseXY-(1+rows)/2,(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p3,'EdgeColor','none','FaceColor','interp')
surf((rows-1)./2.*ones(size(baseXY)),baseXY(:,end:-1:1)-(1+rows)/2,baseZ,'CData',oriPic.p4,'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,ones(size(baseXY)),'CData',oriPic.p6(end:-1:1,end:-1:1,:),'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,rows-1+ones(size(baseXY)),'CData',oriPic.p5(:,end:-1:1,:),'EdgeColor','none','FaceColor','interp')
end
틈새 판:
function showBox2
for i=1:6
oriPic.(['p',num2str(i)])=imread(['result\',num2str(i),'.jpg']);
end
[rows,cols,~]=size(oriPic.p1);
[baseXY,baseZ]=meshgrid(1:cols,rows:-1:1);
fig=figure('units','pixels','position',[300 80 500 500],...
'Numbertitle','off','menubar','none','resize','off',...
'name','box');
ax=axes('parent',fig,'position',[-0.45 -0.45 1.9 1.9]);hold(ax,'on')
ax.ZLim=[0,rows+1];
ax.XLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.YLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.Color=[0 0 0];
ax.CameraPosition=[0,0,rows/2];
ax.CameraPositionMode='manual';
ax.DataAspectRatio=[1,1,1];
ax.DataAspectRatioMode='manual';
ax.Projection='perspective';
ax.CameraTargetMode='manual';
ax.CameraViewAngle = 7;
ax.View=[-2.7391 90.0000];
ax.CameraTarget=[0 0 (rows+1)/2];
ax.Toolbar.Visible='on';
surf(baseXY(:,end:-1:1)-rows/2,-rows./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p1,'EdgeColor','none','FaceColor','interp')
surf(-rows./2.*ones(size(baseXY)),baseXY-(1+rows)/2,baseZ,'CData',oriPic.p2,'EdgeColor','none','FaceColor','interp')
surf(baseXY-(1+rows)/2,rows./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p3,'EdgeColor','none','FaceColor','interp')
surf(rows./2.*ones(size(baseXY)),baseXY(:,end:-1:1)-(1+rows)/2,baseZ,'CData',oriPic.p4,'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,zeros(size(baseXY)),'CData',oriPic.p6(end:-1:1,end:-1:1,:),'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,rows+ones(size(baseXY)),'CData',oriPic.p5(:,end:-1:1,:),'EdgeColor','none','FaceColor','interp')
end
이상 은 MATLAB 전경 도 절단 및 박스 그림 에 표 시 된 상세 한 내용 입 니 다.MATLAB 전경 도 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MATLAB에서 직렬 통신을 실현하는 상세한 절차MATLAB에서 계기기기의 통신 기능을 제공하기 때문에 MATLAB는 직렬 통신을 실현할 수 있다.1. 직렬 통신을 실현하려면 첫 번째 단계는 직렬 대상을 만들어야 한다. MATLAB에서 직렬 대상을 만드는 seri...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.