WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

SSIM Qualitätsmessung von Bildern

 

Flosch
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2012, 10:27     Titel: SSIM Qualitätsmessung von Bildern
  Antworten mit Zitat      
Hallo,

da ich mich immer noch privat mit der Qualitätsmessung von Bildern beschäftige, habe ich nun ein tool entdeckt, welches den ssim- Wert von einem Bild mit Hilfe eines Referenzbildes berechnet. Der Quellcode stammt nicht von mir.

Es sollen hier zwei Bilder eingelesen werden, eines mit einer möglichst guten Qualität und das selbe mit einer schlechten Qualität.

In den Quellcode habe ich jetzt lediglich die Befehle imread und rgb2gray hinter die Funktion am Anfang eingefügt, damit überhaupt zwei Grauwertbilder eingelesen werden. Beim Starten des Programms passiert jedoch leider gar nichts.

Was mir allerdings aufgefallen ist, ist dass der Ausdruck ssim_index in den if- Anweisungen unterstrichen ist. Zudem sind die Variablen img1 und img2 oben in der Funktion farblich hinterlegt, wenn darunter img1 und img2 definiert werden.

Da ich noch relativ unerfahren mit Matlab bin, bräuchte ich Hilfe !
Hoffe es hat jemand eine Idee !

Hier der Quellcode:

https://ece.uwaterloo.ca/~z70wang/research/ssim/ssim_index.m
Private Nachricht senden Benutzer-Profile anzeigen


Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 16.12.2012, 11:13     Titel:
  Antworten mit Zitat      
Moin,

so geht das:

Code:
img1=double(imread('Farbtafel.tif'));
img2=double(imread('Farbtafel.tif'));
img1=rgb2gray(img1);
img2=rgb2gray(img2);
[mssim ssim_map] = ssim_index(img1, img2);  % siehe M File für andere Werte
figure; imshow(uint8(ssim_map))


Interessanter Ansatz, habe mal kurz gegoogelt. Typischerweise wird aber nur der Luminanzkanal verglichen.

Einen schönen Advent!

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Flosch
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.12.2012, 16:36     Titel:
  Antworten mit Zitat      
Hallo Hubertus,

danke erst mal für deine Hilfe !!
Leider läuft das Programm, welchhes die SSIM- Berechnung durchführen soll bei mir noch nicht.

Ich hoffe du kannst noch einmal drüber schauen. Ich habe die entsprechenden Zeilen eingefügt, allerdings bekomme ich da immer folgende Fehlermeldung:

??? Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N)
to change the limit. Be aware that exceeding your available stack space can
crash MATLAB and/or your computer.

Error in ==> imformats>find_in_registry

Also der Quellcode sieht bei mir folgendermaßen aus:


function [mssim, ssim_map] = ssim_index(img1, img2)

%========================================================================
%SSIM Index, Version 1.0
%Copyright(c) 2003 Zhou Wang
%All Rights Reserved.
%
%The author is with Howard Hughes Medical Institute, and Laboratory
%for Computational Vision at Center for Neural Science and Courant
%Institute of Mathematical Sciences, New York University.
%
%----------------------------------------------------------------------
%Permission to use, copy, or modify this software and its documentation
%for educational and research purposes only and without fee is hereby
%granted, provided that this copyright notice and the original authors'
%names appear on all copies and supporting documentation. This program
%shall not be used, rewritten, or adapted as the basis of a commercial
%software or hardware product without first obtaining permission of the
%authors. The authors make no representations about the suitability of
%this software for any purpose. It is provided "as is" without express
%or implied warranty.
%----------------------------------------------------------------------
%
%This is an implementation of the algorithm for calculating the
%Structural SIMilarity (SSIM) index between two images. Please refer
%to the following paper:
%
%Z. Wang, A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli, "Image
%quality assessment: From error measurement to structural similarity"
%IEEE Transactios on Image Processing, vol. 13, no. 1, Jan. 2004.
%
%Kindly report any suggestions or corrections to zhouwang@ieee.org
%
%----------------------------------------------------------------------
%
%Input : (1) img1: the first image being compared
% (2) img2: the second image being compared
% (3) K: constants in the SSIM index formula (see the above
% reference). defualt value: K = [0.01 0.03]
% (4) window: local window for statistics (see the above
% reference). default widnow is Gaussian given by
% window = fspecial('gaussian', 11, 1.5);
% (5) L: dynamic range of the images. default: L = 255
%
%Output: (1) mssim: the mean SSIM index value between 2 images.
% If one of the images being compared is regarded as
% perfect quality, then mssim can be considered as the
% quality measure of the other image.
% If img1 = img2, then mssim = 1.
% (2) ssim_map: the SSIM index map of the test image. The map
% has a smaller size than the input images. The actual size:
% size(img1) - size(window) + 1.
%
%Default Usage:
% Given 2 test images img1 and img2, whose dynamic range is 0-255
%
% [mssim ssim_map] = ssim_index(img1, img2);
%
%Advanced Usage:
% User defined parameters. For example
%
% K = [0.05 0.05];
% window = ones(Cool;
% L = 100;
% [mssim ssim_map] = ssim_index(img1, img2, K, window, L);
%
%See the results:
%
% mssim %Gives the mssim value
% imshow(max(0, ssim_map).^4) %Shows the SSIM index map
%
%========================================================================
img1=double(imread('Axis Filter 0 von Bild 7 Nr 5 HD.png '))
img2=double(imread('Axis Filter 0 Bild 9 Nr 4 HD.png '))


[mssim ssim_map] = ssim_index(img1, img2);

figure; imshow(uint8(ssim_map))

if (nargin < 2 || nargin > 5)
ssim_index = -Inf;
ssim_map = -Inf;
return;
end

if (size(img1) ~= size(img2))
ssim_index = -Inf;
ssim_map = -Inf;
return;
end

[M N] = size(img1);

if (nargin == 2)
if ((M < 11) || (N < 11))
ssim_index = -Inf;
ssim_map = -Inf;
return
end
window = fspecial('gaussian', 11, 1.5); %
K(1) = 0.01; % default settings
K(2) = 0.03; %
L = 255; %
end

if (nargin == 3)
if ((M < 11) || (N < 11))
ssim_index = -Inf;
ssim_map = -Inf;
return
end
window = fspecial('gaussian', 11, 1.5);
L = 255;
if (length(K) == 2)
if (K(1) < 0 || K(2) < 0)
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
else
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
end

if (nargin == 4)
[H W] = size(window);
if ((H*W) < 4 || (H > M) || (W > N))
ssim_index = -Inf;
ssim_map = -Inf;
return
end
L = 255;
if (length(K) == 2)
if (K(1) < 0 || K(2) < 0)
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
else
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
end

if (nargin == 5)
[H W] = size(window);
if ((H*W) < 4 || (H > M) || (W > N))
ssim_index = -Inf;
ssim_map = -Inf;
return
end
if (length(K) == 2)
if (K(1) < 0 || K(2) < 0)
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
else
ssim_index = -Inf;
ssim_map = -Inf;
return;
end
end

C1 = (K(1)*L)^2;
C2 = (K(2)*L)^2;
window = window/sum(sum(window));
img1 = double(img1);
img2 = double(img2);

mu1 = filter2(window, img1, 'valid');
mu2 = filter2(window, img2, 'valid');
mu1_sq = mu1.*mu1;
mu2_sq = mu2.*mu2;
mu1_mu2 = mu1.*mu2;
sigma1_sq = filter2(window, img1.*img1, 'valid') - mu1_sq;
sigma2_sq = filter2(window, img2.*img2, 'valid') - mu2_sq;
sigma12 = filter2(window, img1.*img2, 'valid') - mu1_mu2;

if (C1 > 0 & C2 > 0)
ssim_map = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))./((mu1_sq + mu2_sq + C1).*(sigma1_sq + sigma2_sq + C2));
else
numerator1 = 2*mu1_mu2 + C1;
numerator2 = 2*sigma12 + C2;
denominator1 = mu1_sq + mu2_sq + C1;
denominator2 = sigma1_sq + sigma2_sq + C2;
ssim_map = ones(size(mu1));
index = (denominator1.*denominator2 > 0);
ssim_map(index) = (numerator1(index).*numerator2(index))./(denominator1(index).*denominator2(index));
index = (denominator1 ~= 0) & (denominator2 == 0);
ssim_map(index) = numerator1(index)./denominator1(index);
end

mssim = mean2(ssim_map);

return




Danke vielmals und auch frohe Weihnachten,

Gruß, Flo
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 23.12.2012, 11:45     Titel:
  Antworten mit Zitat      
Moin Flosch,

ich habe bis Mitte Januar keinen Zugang mehr zu einem Matlab-Rechner. Die Fehlersuche kann nicht so problematisch sein. Die Funktion läuft mit normalen RGB-Bildern, keine Index-Bilder. Dann würde ich die Bildgröße noch einmal prüfen. Kann sein, dass bei sehr großen Bildern diese Fehlermeldung auftritt.
Nimm einfach ein Farbbild (RGB ) aus Matlab, dann dürfen keine Probleme auftreten.

Viel Glück und schöne Feiertage

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.