2014-08-29 3 views
2

2 개는 매우 유사한 두 개의 이미지 (코드 RANSAC에 의해)를 비교 한 후 이미지 중 하나를 첫 번째 이미지의 각도로 회전시킵니다. 문제는 일부 이미지에서 검은 색 테두리가있는 것입니다. 해당 이미지가 뒤틀림 현상을 일으키고 회전 함을 나타냅니다. 검정색 테두리가없는 이미지에만 적용됩니다 (무시하십시오)?MATLAB에서 검은 경계선을 무시하는 방법

function [ output_args ] = ransac() 
%frames(filename) 
global numFrames 
a=sprintf('Ransac begin'); 
disp(a); 
for i=1:numFrames 
file_name = sprintf('frames/%0.3i.jpg', i); 
file_name2 = sprintf('frames/%0.3i.jpg', i+1); 
%file_name = sprintf('frames/008.jpg', i); 
%file_name2 = sprintf('frames/049.jpg', i+1); 


I1=im2double(imread(file_name2)); 
I2=im2double(imread(file_name)); 

% Get the Key Points 
Options.upright=true; 
Options.tresh=0.0001; 
Ipts1=OpenSurf(I1,Options); 
Ipts2=OpenSurf(I2,Options); 

% Put the landmark descriptors in a matrix 
D1 = reshape([Ipts1.descriptor],64,[]); 
D2 = reshape([Ipts2.descriptor],64,[]); 

% Find the best matches 
err=zeros(1,length(Ipts1)); 
cor1=1:length(Ipts1); 
cor2=zeros(1,length(Ipts1)); 
for i=1:length(Ipts1), 
    distance=sum((D2-repmat(D1(:,i),[1 length(Ipts2)])).^2,1); 
    [err(i),cor2(i)]=min(distance); 
end 

% Sort matches on vector distance 
[err, ind]=sort(err); 
cor1=cor1(ind); 
cor2=cor2(ind); 

% Make vectors with the coordinates of the best matches 
Pos1=[[Ipts1(cor1).y]',[Ipts1(cor1).x]']; 
Pos2=[[Ipts2(cor2).y]',[Ipts2(cor2).x]']; 
Pos1=Pos1(1:30,:); 
Pos2=Pos2(1:30,:); 

% Show both images 
I = zeros([size(I1,1) size(I1,2)*2 size(I1,3)]); 
I(:,1:size(I1,2),:)=I1; I(:,size(I1,2)+1:size(I1,2)+size(I2,2),:)=I2; 

% Calculate affine matrix 
Pos1(:,3)=1; Pos2(:,3)=1; 
M=Pos1'/Pos2'; 

% Add subfunctions to Matlab Search path 
functionname='OpenSurf.m'; 
functiondir=which(functionname); 
functiondir=functiondir(1:end-length(functionname)); 
addpath([functiondir '/WarpFunctions']) 

% Warp the image 
I1_warped=affine_warp(I1,M,'bicubic'); 

% Show the result 
%figure, 
subplot(1,3,1), imshow(I1);title('Figure 1'); 
subplot(1,3,2), imshow(I2);title('Figure 2'); 
subplot(1,3,3), imshow(I1_warped);title('Warped Figure 1'); 
imwrite(I1_warped,file_name2); 
if (mod(i,20)==0) 
    disp(sprintf('he make a %d',i)); 
end 
end 
sprintf('finish'); 
aaa(); 
end 

답변

1
  1. 카운트 검은 열 - this question. 에 0이 아닌 픽셀이없는 경우 열을 제거하면됩니다.
  2. 동일한 트릭을 행과 함께 사용하십시오.
  3. 나머지는 무엇을해야합니까.

검은 경계선이 실제로 검은 색이 아닌 경우 (예 : 매우 어두운 회색) 실패합니다. 이 경우 검지에 임계 값을 적용하십시오.

또한이 그림의 주요 부분에 검은 색 열이 있으면 나쁜 해결책이 될 것입니다. 이 경우 검정색 열의 위치를 ​​확인하고 테두리에 상대적으로 가까운 열만 제거해야합니다. 여기

는 서사시

I1=im2double(imread('dart.jpg')); 

sizeI = size(I1); 
zeros = floor((sizeI(2) - min(sum(any(I1))))/2); 
I2 = I1(:, zeros : sizeI(2)-zeros, :); 
nonZero = sum(any(I1,2)); 


sizeI2 = size(I2); 
zerosRows = floor((sizeI(1) - min(sum(any(I2, 2))))/2); 
I3 = I2(zerosRows : sizeI2(1)-zerosRows, :, :); 

subplot(1,3,1), imshow(I1);title('Figure 1'); 
subplot(1,3,2), imshow(I2);title('Figure 2'); 
subplot(1,3,3), imshow(I3);title('Figure 3'); 

응용 내부에 검은 행없이 대칭 블랙 박스를 삭제하는 간단한 버전을 "좋은"입력 :

enter image description here

내부 검은 색 라인 이미지에 적용 - 그렇게 좋은 결과는 아닙니다. 색상과 제거 모두 검은 색으로 처음에 가장 왼쪽

  1. 확인 열 : 여기 감지 정확한 필요한 경우 enter image description here

    는 계획이다.

  2. 열의 맨 뒤부터 마지막까지 열을 확인하여 검정색을 제거하고 검은 색을 제거하십시오.
  3. 동일한 행을 사용하십시오.

OP는 혼자서 할 수있는 몇 가지 행렬 연산이기 때문에이 코드는 제공하지 않겠습니다.

+0

좋아 .. 내가이 줄을 어디에 써야하는지 알고 있니? – DDDD

+0

@DDDD 이미지를 읽은 직후입니다. –

0

당신은 여전히 ​​검은 색 테두리가 있기 때문에 당신은 대답하지 않습니다. ... 코드를 복구 할 수 있습니까? 결국 검은 색 테두리가되지 않습니다

관련 문제