Artikel ini menjelaskan contoh kode Java untuk mendapatkan warna utama dalam gambar warna. Bagikan untuk referensi Anda, sebagai berikut:
1: Ide Dasar
Untuk gambar warna dalam ruang warna RGB, kami ingin mendapatkan beberapa warna utama gambar melalui program dalam beberapa kali. Namun, untuk gambar umum, pencampuran piksel dicapai di persimpangan warna. Oleh karena itu, secara langsung memindai nilai piksel gambar dapat menghasilkan sebanyak ratusan nilai warna yang berbeda. Bahkan, gambar mungkin hanya memiliki 3 hingga 4 warna utama. Cara menghapus warna -warna campuran tersebut dan secara akurat mengekstrak warna utama dari 3 hingga 4 ini. Menurut karakteristik gambar umum, gambar tidak akan mencampur nilai warna yang berbeda pada batas warna yang sama dapat dianggap sebagai salah satu karakteristik tepi gambar. Oleh karena itu, ekstrak dari piksel campuran ini dapat dicapai sesuai dengan algoritma gradien tepi sederhana untuk mendapatkan array nilai piksel output, dan kemudian memindai setiap nilai piksel, mencari piksel di sekitar parameter radius yang ditentukan, dan menemukan nol, dan nilai pixel titik piksel yang terdekat dengan piksel pusat yang digunakan sebagai piksel. Setelah pemindaian selesai, array piksel dapat menjadi output, dan kemudian pemindaian linier, array dapat diperoleh untuk mendapatkan nilai warna RGB utama gambar.
Dua: Langkah Implementasi
1. Masukkan array gambar ke grayscale gambar warna;
2. Untuk gambar skala abu -abu, hitung gradien gambar, dan gunakan operator sobol di sini;
3. Untuk setiap titik piksel non-nol, pindai dalam kisaran jari-jari R, dan temukan nilai piksel asli terdekat dari nol;
4. Cukup pindai array yang diperoleh untuk mendapatkan warna utama.
Parameter R adalah untuk menemukan nilai yang paling sesuai sesuai dengan skenario aplikasi yang berbeda. Secara teoritis, semakin besar gambar, semakin besar nilai R seharusnya, jika tidak algoritma tidak akan akurat.
Tiga: Gambaran Asli dan Efek Operasi
Gambar asli
Setelah algoritma dijalankan, empat warna utama diekstraksi
Empat: Kode Sumber Implementasi Algoritma
public static bufferedImage lepasBlendPixels (BufferedImage Image, int raidus) {int width = image.getWidth (); int height = image.getHeight (); int [] piksel = int baru [lebar * tinggi]; getRGB (gambar, 0, 0, lebar, tinggi, piksel); // Buat pemrosesan resultBufferedImage resultImg = createCompatibledestimage (Image, null); setRGB (resultimg, 0, 0, lebar, tinggi, piksel); // Buat pemrosesan resultBufferedImage resultImg = createCompatibledestimage (Image, null); setRGB (resultimg, 0, 0, lebar, tinggi, piksel); // byte grayscale dan gradient [] GrayData = getGrayData (piksel, lebar, tinggi); byte [] BinaryData = getgrident (Graydata, lebar, tinggi); INT INDEX = 0; untuk (int baris = 1; baris <tinggi - 1; baris ++) {untuk (int col = 1; col <lebar - 1; col ++) {index = baris * lebar+col; int pixel = (BinaryData [indeks] & 0xff); if (pixel> 0) {// Radius scan operasi int mindis = integer.max_value; int minrow = -1; int mincol = -1; int nr = 0; int nc = 0; int index2 = 0; untuk (int subrow = -raidus; subrow <= raidus; subrow ++) {nr = baris+subrow; if (nr <0 || nr> = tinggi) {lanjutkan; } untuk (int subcol = -raidus; subkol <= raidus; subcol ++) {nc = col+subcol; if (nc <0 || nc> = lebar) {lanjut; } index2 = nr * lebar + nc; value int = (BinaryData [index2] & 0xff); if (value == 0) {int jarak = distancecolor (image.getrgb (nc, nr), image.getrgb (col, row)); if (jarak <mindis) {mindis = jarak; minrow = nr; MINCOL = NC; }}}} resultImg.setrgb (col, row, image.getrgb (MinCol, minrow)); }}} return resultImg; } public static int distancecolor (int rgb, int rgb2) {// color satu int r1 = (rgb >> 16) & 0xff; int g1 = (rgb >> 8) & 0xff; int b1 = rgb & 0xff; // warnai dua int r2 = (rgb2 >> 16) & 0xff; int g2 = (rgb2 >> 8) & 0xff; int b2 = rgb2 & 0xff; // jarak int rr = r1 - r2; int gg = g1 - g2; int bb = b1 - b2; int sum = (int) math.sqrt (rr * rr + gg * gg + bb * bb); jumlah pengembalian; } public static byte [] getGrayData (int [] inpixels, int width, int tinggi) {// gambar grayscale byte [] outpixels = byte baru [width * height]; INT INDEX = 0; untuk (int baris = 0; baris <tinggi; baris ++) {int tr = 0, tg = 0, tb = 0; untuk (int col = 0; col <width; col ++) {index = baris * lebar+col; tr = (inpixels [index] >> 16) & 0xff; tg = (inpixels [index] >> 8) & 0xff; tb = inpixels [index] & 0xff; int grey = (int) (0,299 * tr + 0,587 * tg + 0,114 * tb); Outpixels [index] = (byte) (abu -abu & 0xff); }} return outpixels; } public static byte [] getgrident (byte [] inpixels, int width, int tinggi) {byte [] outpixels = byte baru [lebar * tinggi]; INT INDEX = 0; untuk (int baris = 0; baris <tinggi; baris ++) {int tr = 0; untuk (int col = 0; col <width; col ++) {if (baris == 0 || col == 0 || (baris == tinggi - 1) || (col == lebar - 1)) {index = baris * lebar+col; Outpixels [index] = (byte) (0x00); melanjutkan; } int xg = 0, yg = 0; untuk (int sr = -1; sr <= 1; sr ++) {for (int sc = -1; sc <= 1; sc ++) {int nrow = baris+sr; int ncol = col + sc; if (nrow <0 || nrow> = tinggi) {nrow = 0; } if (ncol <0 || ncol> = lebar) {ncol = 0; } index = nrow * lebar + ncol; tr = (inpixels [index] & 0xff); xg + = x_sobel [sr + 1] [sc + 1] * tr; yg + = y_sobel [sr + 1] [sc + 1] * tr; }} index = baris * lebar + col; int g = (int) math.sqrt (xg * xg + yg * yg); Outpixels [index] = (byte) (clamp (g) & 0xff); }} return outpixels; } Nilai konstan yang perlu didefinisikan adalah sebagai berikut:
Int final statis public [] [] x_sobel = int baru [] [] {{-1, -2, -1}, {0, 0, 0}, {1, 2, 1}}; int static static final [] [] y_sobel = int new int [] [] {{-1, 0, 1}, {-2, 0, 2}, {-1, 0, 1}}; final public static int block_pixel_radius = 5; Akuisisi gradien menggunakan operator sobol. Kode untuk memindai objek bufferedImage setelah diproses untuk mendapatkan warna utama adalah sebagai berikut:
Int width = result.getWidth (); int tinggi = result.getHeight (); Peta <Integer, Integer> colorIndexMap = hashmap baru <Integer, integer> (); untuk (int row = 0; baris <tinggi; baris ++) {untuk (int col = 0; col <width; col ++) {int pixelValue = result.getrgb (col, baris); if (! colorIndexmap.containsKey (pixelValue)) {colorIndexmap.put (pixelvalue, pixelvalue); }}} // Sekarang pindai nilai piksel // return hasil sistem.out.println ("jumlah warna =" + colorIndexmap.size ()); return colorIndexmap.keyset (). toarray (bilangan bulat baru [0]); Kode tes adalah sebagai berikut:
public static void main (string [] args) {file file = file baru ("d: //gloomyfish//bigmonkey.png"); File resultFile = file baru ("d: //gloomyfish//result.png"); coba {bufferedImage image = imageIO.read (file); BufferedImage hasil = remeCEBLENDPIXELS (Image, block_pixel_radius); Imageo.write (hasil, "png", resultFile); Integer [] warna = ExtractColors (hasil); System.out.println ("Total Warna:" + Colors.Length); } catch (ioException e) {e.printstacktrace (); }}Catatan: Kunci utama adalah memasukkan ukuran gambar yang benar yang akan diproses. Ukuran jari -jari ini terkait dengan ukuran gambar yang sebenarnya, dan algoritma dapat dioptimalkan satu langkah lebih jauh ke dalam versi yang tidak bergantung pada parameter radius, sampai Anda menemukan piksel yang sama dengan nol.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.