Bilderfarben reduzieren

LatinFavourite

Bekanntes Mitglied
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.

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();
		}
			
			
	}
}
 

LatinFavourite

Bekanntes Mitglied
Also ich habe es mir so vorgestellt, dass man mithilfe eines Schiebereglers angeben kann, wie viele Farben erhalten bleiben sollen. Je nach Auswahl müssen dann ja die häufigen Farben beibehalten und die anderen angenähert werden.
 

arilou

Bekanntes Mitglied
Ich seh' zwar keinen Sinn darin, das mittels eines Prozentwerts zu machen (eher schon über die Bitzahl pro Farbkanal), aber das Problem ist nicht so einfach. Um ein gutes Ergebnis zu erhalten, ist nicht nur wichtig, die häufigen Farben beizubehalten, sondern auch die "pointierten", die "besonders herausragen" im Bild - selbst wenn sie eigentlich "selten" sind.

Wenn du dann entschieden hast, welche bleiben, ist der Rest Dithering.
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben