Suche annähernd richtige Formel für CMYK to RGB

kukuk

kukuk

App-Anbieter (kostenlos)
29
Ich weiß das man CMYK nicht 100% zu RGB richtig konvertieren kann, da RGB mit ganzzahlen arbeiten und CMYK mit 2 Kommastellen. Somit geht etwas verloren. Aber die Formel die ich im Internet gefunden habe sind alle übelst falsch.
Da wird aus CMYK 0,0,1,11 -> 244,244,243 raus.
Wenn ich das jetzt Farben umrechnen | RGB <=> CMYK dort umrechne erscheint ein richtiger Wert.
nämlich 227,227,225

Kann mir einer eine richtige Formel für die Umrechnung von CMYK to RGB geben?

Das ist meine:
c m y k sind float variablen.
rot, grün, blau sind integer variablen

c = Math.min(255, Math.round(c) + Math.round(k));
m = Math.min(255, Math.round(m) + Math.round(k));
y = Math.min(255, Math.round(y) + Math.round(k));
rot = 255 - Math.round(c);
grün = 255 - Math.round(m);
blau = 255 - Math.round(y);
 
Hallo kukuk,

ich arbeite hauptberuflich im Bereich Image-Processing.
Ganz sicher kannst du dir sein , wenn du Dir den Source-Schnibbel von OpenCV oder der MathLIB klaust.

Ist aber aufwendiger gelöst .
Viel Erfolg ...


OpenCV : Bsp für RGB->CMYK (c++)
////////////////////////////////////////////////////////////////////////////
void rgb2cmyk(cv::Mat& img, std::vector<cv::Mat>& cmyk)
{
// Allocate cmyk to store 4 componets
for (int i = 0; i < 4; i++)
{
cmyk.push_back(cv::Mat(img.size(), CV_8UC1));
}
// Get rgb
std::vector<cv::Mat> rgb;
cv::split(img, rgb);
// rgb to cmyk
for (int i = 0; i < img.rows; i++) {
for (int j = 0; j < img.cols; j++) {
float r = (int)rgb[2].at<uchar>(i, j) / 255.;
float g = (int)rgb[1].at<uchar>(i, j) / 255.;
float b = (int)rgb[0].at<uchar>(i, j) / 255.;
float k = std::min(std::min(1- r, 1- g), 1- b);
cmyk[0].at<uchar>(i, j) = (1 - r - k) / (1 - k) * 255.;
cmyk[1].at<uchar>(i, j) = (1 - g - k) / (1 - k) * 255.;
cmyk[2].at<uchar>(i, j) = (1 - b - k) / (1 - k) * 255.;
cmyk[3].at<uchar>(i, j) = k * 255.;
}
}
}

////////////////////////////////////////////////////////////////////////////



Keine direkte C & P Lösung für dich , aber vielleicht hilft dir der Ansatz weiter
lg
Stefan
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: kukuk
Vielen Dank, aber ich suche den genau umgekehrten Weg. Vom CMYK -> RGB. Die Richtung RGB nach CMYK funktioniert fehlerfrei.


final EditText edittext5 = (EditText) findViewById(R.id.editText5);
final EditText edittext6 = (EditText) findViewById(R.id.editText6);
final EditText edittext7 = (EditText) findViewById(R.id.editText7);
final EditText edittext8 = (EditText) findViewById(R.id.editText8);


float computedC = 0;
float computedM = 0;
float computedY = 0;
float computedK = 0;



if (r==0 && g==0 && b==0) {
computedK = 1;
edittext5.setText("0");
edittext6.setText("0");
edittext7.setText("0");
edittext8.setText("100");
return;

}
computedC = 1 - (r/255f);
computedM = 1 - (g/255f);
computedY = 1 - (b/255f);
float minCMY = Math.min(computedC,Math.min(computedM,computedY));
if (1-minCMY!=0){
computedC = (computedC - minCMY) / (1 - minCMY);
computedM = (computedM - minCMY) / (1 - minCMY) ;
computedY = (computedY - minCMY) / (1 - minCMY);
computedK = minCMY;
}
c = computedC;
m = computedM;
y =computedY;
k = computedK;

edittext5.setText(""+Math.round((c*100f)*100) / 100.0);
edittext6.setText(""+Math.round((m*100f)*100) / 100.0);
edittext7.setText(""+Math.round((y*100f)*100) / 100.0);
edittext8.setText(""+Math.round((k*100f)*100) / 100.0);
//}catch (Exception e){

//}
[doublepost=1465745345,1465744207][/doublepost]Durch diese Zeile habe ich eine Lösung gefunden void cmyk2rgb(cv::Mat& img, std::vector<cv::Mat>& cmyk)
Der Suchbegriff bei Google cmyk2rgb bringt einige neue erkenntnisse zum VOrschein.

Falls noch jemand sowas sucht:



float rot = 0;
float grün = 0;
float blau = 0;

c = Float.parseFloat(edittext5.getText().toString());
m = Float.parseFloat(edittext6.getText().toString());
y = Float.parseFloat(edittext7.getText().toString());
k = Float.parseFloat(edittext8.getText().toString());


c = c / 100;
m = m / 100;
y = y / 100;
k = k / 100;

rot = 1 - Math.min( 1, c * ( 1 - k ) + k );
grün = 1 - Math.min( 1, m * ( 1 - k ) + k );
blau = 1 - Math.min( 1, y * ( 1 - k ) + k );





edittext1.setText(""+Math.round(rot *255));
edittext2.setText(""+Math.round(grün *255));
edittext3.setText(""+Math.round(blau *255));
img1.setBackgroundColor(Color.rgb(Math.round(rot*255),Math.round(grün*255), Math.round(blau*255)));
 

Ähnliche Themen

netfreak
  • netfreak
Antworten
10
Aufrufe
462
netfreak
netfreak
A
Antworten
10
Aufrufe
1.022
swa00
swa00
5
Antworten
0
Aufrufe
1.151
586920
5
Zurück
Oben Unten