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

Hintergrund von Bild ändern

 

Philipp68
Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 06.08.2020, 16:26     Titel: Hintergrund von Bild ändern
  Antworten mit Zitat      
Hallo,
ich erstelle mir eine Form bsp. Kreisring, die ein Muster enthält. Dafür nutze ich folgenden Code. Im Anhang ist das Ergebnis auch so wie ich es haben möchte.
Also nächstes möchte ich nun dem Hintergrund einen anderen Grauwert geben, 0-256. Und hier ist das Problem. Mein Muster enthält 0en und 1en und mein Hintergrund besteht auch aus 0en. Wenn ich der 0 einen anderen Grauwert zuweise, nimmt auch das Schwarz meines Musters diesen an und das möchte ich nicht. Ansich müsste ich die Form mit Muster selektieren, damit ich meinem Hintergrund einen anderen GW geben kann. Oder wäre es sinnvoll für meine Maske keine Logical Values zu verwenden und dort gleich den Hintergrund mit dem GW zu definieren?

Schon mal vielen Dank für eure Tipps!

Code:

% Shape 1
xCenter = 960;
yCenter = 540;
theta = 45 : 0.01 : 360;
radius = 250;

x = radius * cosd(theta) + xCenter;
y = radius * -sind(theta) + yCenter;

% Tack on the center
x = [xCenter, x, xCenter];
y = [yCenter, y, yCenter];

% Shape 2
xCenter2 = 960;
yCenter2 = 540;
theta2 = 45 : 0.01 : 360;
radius2 = 500;
x2 = radius2 * cosd(theta2) + xCenter2;
y2 = radius2 * -sind(theta2) + yCenter2;

% Tack on the center
x2 = [xCenter2, x2, xCenter2];
y2 = [yCenter2, y2, yCenter2];


% Read in gray scale image.   Actually can be anything - RGB or gray scale.
grayImage = imread('Checkerboard.png');

% Mask 1-Shape to polygon
mask = poly2mask(x,y,size(grayImage, 1), size(grayImage, 2));
mask = double(mask);
%
% mask(mask == 0) = 100;
% mask(mask == 1) = 256;
% mask = uint8(mask);
%
subplot(1,2,1)
imshow(mask,[]);

% Mask 2-Shape to polygon
mask2 = poly2mask(x2,y2,size(grayImage, 1), size(grayImage, 2));
%
% mask2 = double(mask2);
% mask2(mask2 == 0) = 100;
% mask2(mask2 == 1) = 256;
% mask2 = uint8(mask2);
%
subplot(1,2,1)
imshow(mask2,[]);

% Mask the image using bsxfun() function
maskedGrayImage = bsxfun(@times, grayImage, cast(mask, class(grayImage)));

% Mask the image using bsxfun() function
maskedGrayImage2 = bsxfun(@times, grayImage, cast(mask2, class(grayImage)));

subplot(3,3,4)
imshow(mask);
title('Mask 1')

subplot(3,3,5)
imshow(mask2);
title('Mask 2')

subplot(3,3,6)
mask_diff = mask2-mask;
imshow(mask_diff);
title('Mask Subtracting (Mask 2 - Mask 1)');

subplot(3,3,7)
imshow(maskedGrayImage);
title('Mask 1 on Image');

subplot(3,3,8)
imshow(maskedGrayImage2);
title('Mask 2 on Image');

subplot(3,3,9)
maskedGray_diff = maskedGrayImage2-maskedGrayImage;
imshow(maskedGray_diff);
title('Masked Image Subtracting');

subplot(3,3,1:3)
imshow(grayImage);
title('Shape Color/Pattern');

imwrite(maskedGray_diff,'Test2.png');
 


Mask.png
 Beschreibung:

Download
 Dateiname:  Mask.png
 Dateigröße:  22.15 KB
 Heruntergeladen:  166 mal
Private Nachricht senden Benutzer-Profile anzeigen


Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 06.08.2020, 17:17     Titel:
  Antworten mit Zitat      
Da die Bilder die gleiche Größe haben, könnte ich doch sagen:

Setze mir auf den Index meiner Maske mit dem Wert 1, den Wert meines Muster an gleiche Stelle
Setze mir auf den Index meiner Maske mit dem Wert 0, den GW meines Hintergrunds

Code:

Muster = imread('Checkerboard.png'); %Schwarz = 0, Weiß = 1
Muster = double(Muster);
Muster(Muster == 1) = 256; %Schwarz = 0, Weiß = 256


MusterundHintergrund = zeros(1080,1920); % Neues Bild

% Mask_diff besteht aus double(1080,1920) aus 0en und 1en

for i = 1:1080
    for j = 1:1920
        if mask_diff(i,j) == 1 % Hier soll das Muster hin
            MusterundHintergrund(i,j) = Muster(i,j);
        elseif mask_diff(i,j) == 0 % Mein Hintergrund
            MusterundHintergrund(i,j) = 100;
        end
    end
end
 


Tada, hier das Ergbenis!
Falls es eine bessere Variante oder Möglichkeit gibt, um es gleich mit der Maske zu verbinden, gerne Bescheid sagen Smile

Ergebnis.png
 Beschreibung:

Download
 Dateiname:  Ergebnis.png
 Dateigröße:  7.51 KB
 Heruntergeladen:  172 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.08.2020, 17:53     Titel:
  Antworten mit Zitat      
Hallo,

das wäre auch mein Vorschlag, nur etwas kompakter und vermutlich kompakter über logische Indizierung:

Code:
MusterundHintergrund = Muster;
MusterundHintergrund(mask_diff == 0) = 100;


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 06.08.2020, 18:51     Titel:
  Antworten mit Zitat      
Hallo Harald, genau damit geht es auch!


Was mir jetzt noch eingefallen ist. Wenn ich das Bild aus meiner letzten Antwort mit einem zweiten Bild (zB Kreis mit anderem Muster oder GW und Radius = Innenradius vom Kreisring) kombinieren möchte, also zu einem Bild, dann fällt mir als ersten eine Addition ein. Dadurch addiere ich den GW des Hintergrunds mit den Werten im Kreis, die nicht mehr die ursprünglichen sein werden.

Addiere ich die Bilder über einen schwarzen Hintergrund, habe ich meinen Kreisring mit dem Schachbrettmuster, einen Kreis mit Muster oder anderem GW und einen schwarzen Hintergrund.

Problem: Hintergrund Wert = 0, Schwarz in Schachbrettmuster Wert = 0, Werte in Kreis eventuell = 0

Dann funktioniert meine Lösung nicht. Ich müsste dann für das Schachbrettmuster Schwarz = 1 und Weiß = 256 zuweisen. Damit habe ich dann wieder den Hintergrund als Wert 0. Ist nur die Frage, wie das ganze funktioniert, wenn ich Grauwertbilder als Füllung verwenden möchte, die dann Werte von 0-256 enthalten können und mit anderen Bildern überlager, wie in PS mit mehreren Ebenen.
Ich müsste mal nachschauen, ob man den Hintergrund anfangs transparent machen kann und ihm zum Schluss einen GW zuweist.
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 07.08.2020, 09:55     Titel:
  Antworten mit Zitat      
Mir ist auch noch eine andere Variante eingefallen, bei der ich mir jedoch nicht sicher bin, ob sie so gut und viel zu umständlich ist?

Ich erstelle ja zu Beginn eine Maske, die ein Kreis oder Kreisring ist. Dann erhalte ich eine 1920x1080 Matrix in der meine Form aus 1 und der Hintergrund aus 0 besteht. Nun könnte ich mir die Indizes meiner 1en von der Form zB als Bildinfo.txt abspeichern. Für eine zweite Form mache ich das gleiche. Möchte ich nun Form 1 und Form 2 kombinieren erstelle ich eine neue Matrix 1920x1080 aus Nullen (Mein Zielbild), setze die Bildpunkte meines ersten Bildes auf die Indizes 1 meiner ersten Form. Danach setze ich das zweite Bild auf die Indizes 1 meiner zweiten Form und dort wo ich eine 0 habe, gebe ich dem Hintergrund meinen gewünschten GW.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.08.2020, 13:28     Titel:
  Antworten mit Zitat      
Hallo,

den Erklärungen zu folgen fällt mir etwas schwer. Vorschlag aber:

Zitat:
Nun könnte ich mir die Indizes meiner 1en von der Form zB als Bildinfo.txt abspeichern.

Wenn es nicht nach Abschluss der MATLAB-Session verfügbar bleiben muss, würde ich so etwas nicht in einer Datei, sondern in einer Variablen abspeichern, z.B.
Code:
isOne = mask == 1;

wobei das doch im wesentlichen die Maske an sich ist?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 10.08.2020, 10:51     Titel:
  Antworten mit Zitat      
Hallo Harald,

die Variable müsste zu jeder Zeit verfügbar sein (Tage/Wochen später), da für eine Studie immer wieder unterschiedliche Formen mit einem Muster generiert und kombiniert werden und die bisherigen erstellen erhalten bleiben sollen.

Ich habe zur Zeit ein anderes Problem, das ich jetzt bearbeiten/lösen muss und deswegen dieses Thema jetzt leider pausiert. Sobald ich das fertig habe, würde ich mich hier wieder einklinken.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.08.2020, 15:50     Titel:
  Antworten mit Zitat      
Hallo,

dann als .mat abspeichern.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.