When I did blockmatching algorithm on the tennis man image, and did a comparaison between the original and reconstructed image I got this black boxes, why?

댓글 수: 5

Image Analyst
Image Analyst 2023년 4월 8일
There is no way to tell with the minimal information you have shared. If you have any more questions, then attach your image(s) and code to read it in with the paperclip icon after you read this:
Blob
Blob 2023년 4월 8일
편집: Walter Roberson 2023년 4월 8일
clc
clear all
close all
load('f1.mat');
load('f2.mat');
figure;
subplot 121
imagesc(F1);
title('image 1');
subplot 122
imagesc(F2);
title('image 2');
colormap gray
load('e1.mat');
load('e2.mat');
figure;
subplot 121
imagesc(e1);
title('image 1');
subplot 122
imagesc(e2);
title('image 2');
colormap gray
[M N]=size(F1);
T=16;
nbr_l=M/T;
nbr_c=N/T;
indbloc_x=1:nbr_l;
indbloc_y=1:nbr_c;
L=length(indbloc_x);
Q=length(indbloc_y);
F2_recons = zeros(size(F2));
for i=1:L
for j=1:Q
X=indbloc_x(i);
Y=indbloc_y(j);
if i==L
1+1
end
%for n=1:T
% bloc2=F2(X:X+T-1,Y:Y+T-1);
bloc2=F2((1:16)+(i-1)*16,(1:16)+(j-1)*16);
eqm=inf(15, 15);
mineqm = inf;
for i1=-7:7
for i2=-7:7
condition = (X+i1) >=1 & (Y+i2) >=1;
condition2 = ((16+(i-1)*16+i1)<=M) & ((16+(j-1)*16+i2)<=N);
if ~(condition&&condition2)
continue
else
bloc1=F1((1:16)+(i-1)*16+i1,(1:16)+(j-1)*16+i2);
eqm(i1+8, i2+8)=(1/(nbr_l*nbr_l))*(sum(sum(bloc2-bloc1).^2));
if eqm(i1+8, i2+8)< mineqm
%stocke bloc1 et les indices qui correspondent
mineqm = eqm(i1+8, i2+8);
indx=i1;
indy=i2;
bloc1min = bloc1;
end
end
end
end
F2_recons((1:16)+(i-1)*16,(1:16)+(j-1)*16) = bloc1min;
end
end
figure
imshow(uint8(F2_recons))
Walter Roberson
Walter Roberson 2023년 4월 8일
We would need your .mat files for testing.
Blob
Blob 2023년 4월 8일
(Just showing the output, not trying to debug the problem)
Untitled5

댓글을 달려면 로그인하십시오.

답변 (1개)

Walter Roberson
Walter Roberson 2023년 4월 8일

0 개 추천

Your attached code (but not your posted code) has
imshow (F2_recons - e1)
where both of those arrays are double precision and happen to contain integer values. The difference between the two arrays ranges between -255 and +206 . You are passing that array of values -255 to +206 to imshow() as a double precision array. By default, when passed a double precision array, imshow() assumes that the valuable part of the data is the range 0 to 1, and that anything below 0 should be treated as 0 and anything above 1 should be treated as 1. So you more or less end up binarizing the difference array.
You should be considering using
imagesc(F2_recons - e1);
colormap(gray)

댓글 수: 2

Blob
Blob 2023년 4월 10일
@Walter Roberson thank you, I have one more request, could you please show me how to plot the vectors of motion?
Walter Roberson
Walter Roberson 2023년 4월 10일
Sorry, no, I do not see anything in your code that corresponds to vectors of motion, or anything that corresponds to motion at all. I cannot tell what you are calculating at all.

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Image Filtering and Enhancement에 대해 자세히 알아보기

질문:

2023년 4월 8일

댓글:

2023년 4월 10일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by