Guten Abend,
ich arbeite gerade daran, die Farben in einem Bild zu ermitteln und möchte diese später per Auswahl eines Prozentwertes reduzieren lassen. Ich habe dazu bereits begonnen, ein Histogramm zu erarbeiten und mir überlegt, wie ich den Abstand zwischen den Farben emitteln möchte. Jedoch ist mir nun nicht ersichtlich, welche Farben ich wählen muss. Wenn ich beispielweise lediglich die Hälfte der Farben verwenden möchte, so muss ich doch die häufigsten Farben ermitteln und die anderen 50 Prozent an diese häufig vorkommenden annähern? Ist das soweit korrekt oder habe ich es falsch verstanden. Hier bereits ein Ansatz.
ich arbeite gerade daran, die Farben in einem Bild zu ermitteln und möchte diese später per Auswahl eines Prozentwertes reduzieren lassen. Ich habe dazu bereits begonnen, ein Histogramm zu erarbeiten und mir überlegt, wie ich den Abstand zwischen den Farben emitteln möchte. Jedoch ist mir nun nicht ersichtlich, welche Farben ich wählen muss. Wenn ich beispielweise lediglich die Hälfte der Farben verwenden möchte, so muss ich doch die häufigsten Farben ermitteln und die anderen 50 Prozent an diese häufig vorkommenden annähern? Ist das soweit korrekt oder habe ich es falsch verstanden. Hier bereits ein Ansatz.
Java:
ublic class ColourHistogram {
BufferedImage buff_Img;
int[] pixel;
int[] cnt;
ArrayList<Integer> redColours = new ArrayList<Integer>();
ArrayList<Integer> greenColours = new ArrayList<Integer>();
ArrayList<Integer> blueColours = new ArrayList<Integer>();
ArrayList<Integer> colours = new ArrayList<Integer>();
BufferedWriter colourWriter;
private Desktop desk;
File file;
public ColourHistogram(int[] pixel, Image img){
this.pixel = pixel;
buff_Img = (BufferedImage) img;
cnt = new int[pixel.length];
//
Auswerten();
getRGBColour();
}
void Auswerten(){
quick_sort(pixel);
for(int i1 = 0, i2 = 0; i1 != pixel.length;++i1){
if(i1>1&&(pixel[i1-1])!=pixel[i1]){
colours.add(pixel[i1]);
++cnt[i2];
++i2;
}else{
++cnt[i2];
}
}
}
static void quick_sort(int[] field) {
quick_sort_help(field,0,field.length-1);
}
static void quick_sort_help(int[] field, int iLeft, int iRight) {
final int MID = field[(iLeft + iRight) / 2];
int l = iLeft;
int r = iRight;
while(l < r) {
while(field[l] < MID) { ++l; }
while(field[r] > MID) { --r; }
if(l <= r)
swap(field, l++, r--);
}
if (iLeft < r)
quick_sort_help(field, iLeft, r );
if (iRight > l)
quick_sort_help(field, l, iRight);
}
static void swap(int[] field,int iPos1,int iPos2) {
int tmp = field[iPos1];
field[iPos1] = field[iPos2];
field[iPos2] = tmp;
}
public void getRGBColour(){
int width = buff_Img.getWidth();
int height = buff_Img.getHeight();
try {
colourWriter = new BufferedWriter(new FileWriter("Colours.txt"));
} catch (IOException e) {
e.printStackTrace();
}
file = new File("Colours.txt");
desk = Desktop.getDesktop();
for(int x=0; x<width; ++x){
for(int y=0; y<height; ++y){
int rgb = buff_Img.getRGB(x, y);
Color c = new Color(rgb);
redColours.add(c.getRed());
greenColours.add(c.getGreen());
blueColours.add(c.getBlue());
try{
colourWriter.write("RED " + c.getRed() + " GREEN " + c.getGreen() + " BLUE " + c.getBlue());
colourWriter.newLine();
}catch(IOException ex){
ex.printStackTrace();
}
}
}
try{
colourWriter.close();
desk.open(file);
}catch(IOException ex){
ex.printStackTrace();
}
}
}