В этой статье описывается пример кода Java для получения основного цвета в цветном изображении. Поделитесь этим для вашей ссылки, следующим образом:
1: Основные идеи
Для цветного изображения в цветовом пространстве RGB мы хотим много раз получить несколько основных цветов изображения через программу. Однако для общих изображений смешивание пикселей достигается на цветовом соединении. Следовательно, непосредственное сканирование значений пикселей изображения может привести к сотням различных значений цвета. На самом деле, изображение может иметь только от 3 до 4 основных цветов. Как удалить эти смешанные цвета и точно извлечь основные цвета этих 3–4. Согласно характеристикам общего изображения, изображение не будет смешивать различные значения цвета на границе одного и того же цвета, можно рассматривать как одна из характеристик края изображения. Следовательно, извлечение этих смешанных пикселей может быть достигнуто в соответствии с простом алгоритмом градиента края для получения массива значений выходного пикселя, а затем сканировать каждое значение пикселя, ищет пиксели вокруг указанного параметра RADIUS RAM и поиск нулевого значения и значения точки пикселя, ближайшего к центральному пикселю в качестве значения пикселя. После завершения сканирования массив пикселей может быть выведен, а затем линейно сканирование массива может быть получено для получения основного цветного значения RGB изображения.
Два: шаги реализации
1. Введите массив изображений, чтобы серого цвета цветного изображения;
2. Для изображения серого рассчитайте градиент изображения и используйте здесь оператора Sobol;
3. Для каждой ненулевой точки пикселя сканируйте в диапазоне радиуса R и найдите ближайшее исходное значение пикселя нулевого;
4. Просто сканируйте полученный массив, чтобы получить основной цвет.
Параметр R - найти наиболее подходящее значение в соответствии с различными сценариями применения. Теоретически, чем больше изображение, тем больше должно быть значение R, в противном случае алгоритм будет неточным.
Три: оригинальный эффект изображения и работы
Исходное изображение
После того, как алгоритм запускается, извлечены четыре основных цвета
Четыре: исходный код реализации алгоритма
Public Static BufferedImage RemoveBlendPixels (BufferedImage Image, int Raidus) {int width = image.getWidth (); int height = image.getheight (); int [] pixels = new int [ширина * высота]; getrgb (изображение, 0, 0, ширина, высота, пиксели); // Создание результатов обработки BufferedImage resultImg = createCompatibleStiMage (Image, NULL); setrgb (ResultImg, 0, 0, ширина, высота, пиксели); // Создание результатов обработки BufferedImage resultImg = createCompatibleStiMage (Image, NULL); setrgb (ResultImg, 0, 0, ширина, высота, пиксели); // серого и градиентный байт [] graydata = getGrayData (пиксели, ширина, высота); Byte [] BinaryData = GetGrident (Graydata, ширина, высота); int index = 0; for (int row = 1; row <height - 1; row ++) {for (int col = 1; col <ширина - 1; col ++) {index = row * width+col; int pixel = (binarydata [index] & 0xff); if (pixel> 0) {// Работа Radius scan int mindis = integer.max_value; int minrow = -1; int mincol = -1; int nr = 0; int nc = 0; int index2 = 0; for (int subrow = -craidus; subrow <= raidus; subrow ++) {nr = row+subrow; if (nr <0 || nr> = height) {продолжить; } for (int subcol = -craidus; subcol <= raidus; subcol ++) {nc = col+subcol; if (nc <0 || nc> = width) {продолжить; } index2 = nr * width + nc; int value = (BinaryData [Index2] & 0xff); if (value == 0) {int distance = distanceColor (image.getrgb (nc, nr), image.getrgb (col, row)); if (дистанция <mindis) {mindis = distance; minrow = nr; mincol = nc; }}}} resultImg.setrgb (col, row, image.getrgb (mincol, minrow)); }}} вернуть ResultImg; } public static int distanceColor (int rgb, int rgb2) {// color one int r1 = (rgb >> 16) & 0xff; int g1 = (rgb >> 8) & 0xff; int b1 = rgb & 0xff; // цвет два int r2 = (rgb2 >> 16) & 0xff; int g2 = (rgb2 >> 8) & 0xff; int b2 = rgb2 & 0xff; // расстояние int rr = r1 - r2; int gg = g1 - g2; int bb = b1 - b2; int sum = (int) math.sqrt (rr * rr + gg * gg + bb * bb); вернуть сумму; } public static byte [] getGrayData (int [] inpixels, int width, int height) {// изображение байт серого таблица [] utpixels = new Byte [ширина * высота]; int index = 0; for (int row = 0; row <height; row ++) {int tr = 0, tg = 0, tb = 0; for (int col = 0; col <ширина; col ++) {index = row * width+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) (grey & 0xff); }} вернуть осадки; } public static byte [] getGrident (byte [] inpixels, int width, int height) {byte [] utpixels = new Byte [ширина * высота]; int index = 0; for (int row = 0; row <height; row ++) {int tr = 0; for (int col = 0; col <width; col ++) {if (row == 0 || col == 0 || (row == высота - 1) || (col == width - 1)) {index = row * width+col; Отввели [index] = (byte) (0x00); продолжать; } int xg = 0, yg = 0; for (int sr = -1; sr <= 1; sr ++) {for (int sc = -1; sc <= 1; sc ++) {int nrow = row+sr; int ncol = col + sc; if (nrow <0 || nrow> = height) {nrow = 0; } if (ncol <0 || ncol> = width) {ncol = 0; } index = nrow * width + ncol; tr = (inpixels [index] & 0xff); xg + = x_sobel [sr + 1] [sc + 1] * tr; yg + = y_sobel [sr + 1] [sc + 1] * tr; }} index = row * width + col; int g = (int) math.sqrt (xg * xg + yg * yg); Outpixels [index] = (byte) (зажим (G) и 0xff); }} вернуть осадки; } Постоянные значения, которые необходимо определить, следующие:
public Static Final int [] [] x_sobel = new int [] [] {{-1, -2, -1}, {0, 0, 0}, {1, 2, 1}}; public Static Final int [] [] y_sobel = new int [] [] {{-1, 0, 1}, {-2, 0, 2}, {-1, 0, 1}}; Public Static Final int block_pixel_radius = 5; Приобретение градиента использует оператор SOBOL. Код для сканирования объекта BuffereMage после обработки для получения основного цвета заключается в следующем:
int width = result.getWidth (); int height = result.getheight (); Map <Integer, Integer> ColorindexMap = new Hashmap <Integer, Integer> (); for (int row = 0; row <height; row ++) {for (int col = 0; col <width; col ++) {int pixelvalue = result.getrgb (col, row); if (! colorindexmap.containskey (pixelvalue)) {colorindexmap.put (pixelvalue, pixelvalue); }}} // теперь сканирование значения пикселя // return result System.out.println ("Количество Color =" + colorindexmap.size ()); вернуть colorindexmap.keyset (). toarray (новое целое число [0]); Тестовый код заключается в следующем:
public static void main (string [] args) {file file = new file ("d: //gloomyfish//bigmonkey.png"); File resultfile = new File ("d: //gloomyfish//result.png"); try {buffereMage image = imageIo.read (file); BufferedImage result = removeBlendPixels (image, block_pixel_radius); Imageio.write (результат, "png", Resultfile); Integer [] colors = Extractcolors (результат); System.out.println ("Total Colors:" + colors.length); } catch (ioException e) {e.printstackTrace (); }}Примечание. Основным ключом является введение правильного размера обработки изображения. Этот размер радиуса связан с фактическим размером изображения, и алгоритм может быть оптимизирован еще один шаг в версию, которая не зависит от параметра RADIUS, пока вы не найдете пиксель, равный нулю.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.