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

Daten vergleich in Matlab

 

Gokhlayeh
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 17.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2016, 12:22     Titel: Daten vergleich in Matlab
  Antworten mit Zitat      
Hi liebe Forum-Mitglieder,

ich habe folgendes "Problem". Ich habe ein Bild, dessen RGB Werte der einzelnen Pixel ich einlesen lasse und eine dazugehörige Colormap mit 401 Indices. Darüber hinaus habe ich im workspace eine 401x4 matrix hinterlegt, in der ich diesen RGB Werten meiner Colormap als vierte Spalte einen Referenzwert zugeordnet habe. (also 1. Spalte R, 2. Spalte G, 3. Spalte B und 4. Spalte Referenzwert) (wobei G immer 0 ist)

Was ich gerne machen würde:
Ich möchte das Matlab die eingelesenen RGB Werte des Bildes mit denen in der 401x4 Matrix vergleicht und bei Übereinstimmung, den Referenzwert in der 4. Spalte als Ergebnis ausgeben lasse. (am besten als Plot, als neue Matrix wäre für den Anfang auch klasse)

Weitere Schwierigkeit: Nicht alle RGB Werte des Bildes sind in der Matrix auch enthalten. Deswegen sollte Matlab am besten nicht nur den genauen RGB Wert des Pixels suchen, sondern eine "definierte Umgebung". Vielleicht einfacher mit einem Beispiel:

Mein Pixel hat die RGB Werte 140, 0, 153

In der Matrix sieht es aber so aus:

130, 0, 160 50
135, 0, 155 75
140, 0, 150 100
145, 0, 145 125

Wäre super, wenn Matlab dann den Referenzwert 100 ausspuckt, weil es erkennt, dass 140, 0, 150 in der Nähe von 140, 0, 153 liegt.

Ich hoffe meine Frage ist deutlich geworden? Für jegliche Hilfe vorab besten Dank! Anbei mein Code, so wie ich ihn bisher habe.

Christian

RGB_ret = xlsread ('colormap', 2, 'A2: D402');

R = RGB_ret(:,1);
G = RGB_ret(:,2);
B = RGB_ret(:,3);
C = [R,G,B];
ret= RGB_ret (:,4);

for i=1 : length(C);
color=C(i,:);
result(i,1)=color(1)/255;
result(i,2)=color(2)/255;
result(i,3)=color(3)/255;
end

map(1:401, :) = result;
colormap(map)
%colormapeditor
colorbar


%%%Einlesen der image-Datei und Kanalaufteilung%%%
img = imread('nametest.png'); % Read image
red = img(:,:,1); % Red channel
green = img(:,:,2); % Green channel
blue = img(:,:,3); % Blue channel

a = zeros(size(img, 1), size(img, 2));

just_red = cat(3, red, a, a);
just_green = cat(3, a, green, a);
just_blue = cat(3, a, a, blue);

back_to_original_img = cat(3, red, green, blue);

% figure, imshow(img), title('Original image')
figure, imshow(just_red), title('Red channel')
% figure, imshow(just_green), title('Green channel')
figure, imshow(just_blue), title('Blue channel')
figure, imshow(back_to_original_img, colormap(map)), title('Back to original image')

% Rmax = max(red)
% Gmax = max (green)
% Bmax = max (blue)
Private Nachricht senden Benutzer-Profile anzeigen


ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2016, 13:10     Titel:
  Antworten mit Zitat      
Hallo,

folgender Vorschlag --> du kannst Zeilenweise die Pixelwerte von deiner Matrix abziehen und dann suchen wo die geringste Abweichung ist:

Code:

A = [deine Matrix];
B = [RGB Pixel];

for i = 1:length(A)
  C(i,1:3) = abs(A(i,1:3) - B);
end

Ref = A(find(min(sum(C,2)) == sum(C,2)),4); % Ausgabe der Referenz
 


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Gokhlayeh
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 17.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2016, 15:12     Titel:
  Antworten mit Zitat      
Hey ro_mat,

erst einmal: klasse Befehl, hilft mir schon sehr weiter! Echt Klasse! Vielen Dank!

Aber weißt du, oder jemand anderes noch, wie ich bei B = [RGB Pixel] nicht nur einen händisch eingegebenen Wert vergleichen kann, sondern Matlab da meine Matrix mit den von meinen Bild eingelesenen RGB-Werten "geben kann" und er automatisch diese Operation mit allen dort enthaltenen Werten macht? Und mir für jedes Pixel den passenden Referenzwert ausspuckt?

Idealerweise mit einem Befehl verbunden, der diese Referenzwerte in einer figure plotet! :-D

Ich weiß, viele Wünsche, aber es wäre super, wenn das klappt! Vielen Dank!

Christian

Zuletzt bearbeitet von Gokhlayeh am 14.07.2016, 15:25, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2016, 15:22     Titel:
  Antworten mit Zitat      
Hallo,

du bekommst ja durch diese Befehle:

Code:

red = img(:,:,1); % Red channel
green = img(:,:,2); % Green channel
blue = img(:,:,3); % Blue channel
 


ja deine Pixels in RGB oder nicht? Diese kannst du ja dann auch Schrittweise in der for-Schleife durchlaufen lassen! Oder sehe ich das falsch?
Private Nachricht senden Benutzer-Profile anzeigen
 
Gokhlayeh
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 17.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2016, 16:26     Titel:
  Antworten mit Zitat      
Hey,
nochmals vielen Dank.

Ja an so etwas in der Art hatte ich gedacht.
Also quasi soll mein 'B' wie es unten im for-Befehl ist auch eine Schleife darstellen, oder? Allerdings besteht mein 'B' aus einer Matrix mit 900x300x3 Werten (also 900 x 300 Pixel die jeweils den RGB pro Pixel enthalten), während mein A-Matrix aus 401x4 Werten besteht. Ich müsste doch jetzt eigentlich meine Pixel in einzelne Spalten sortieren. Z.B. Pixel 1-1 = R1-1G1-1B1-1, Pixel 1-2 = R1-2G1-2B1-2,....Pixel 1-869= R1-869G1-869B1-869, unsw..
Hättest Du da eine Idee wie ich das machen kann?

Bzw. habe ich deinen Kommentar richtig verstanden?

Vielen Dank!
Christian

%%%
A = [deine Matrix];
B = [RGB Pixel];

for i = 1:length(A)
C(i,1:3) = abs(A(i,1:3) - B);
end

Ref = A(find(min(sum(C,2)) == sum(C,2)),4); % Ausgabe der Referenz
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.07.2016, 12:30     Titel:
  Antworten mit Zitat      
Hallo,

ja so muss es gehen, du hast ein Bild mit 900 * 300 Pixel was heißt du brauchst eine Matrix B mit 27000x3 - also jedes Pixel RGB Smile

Code:

B = reshape(Matrix, [], 3);
 


Schau mal ob dir das hilft!
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 - 2025 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.