تصف هذه المقالة رمز مثال Java للحصول على اللون الرئيسي في صورة ملونة. شاركه للرجوع إليه ، على النحو التالي:
1: الأفكار الأساسية
للحصول على صورة ملونة في مساحة ألوان RGB ، نريد الحصول على عدة ألوان رئيسية للصورة من خلال البرنامج عدة مرات. ومع ذلك ، بالنسبة للصور العامة ، يتم تحقيق خلط البيكسل عند تقاطع اللون. لذلك ، قد يؤدي مسح قيم البكسل للصورة مباشرة إلى ما يصل إلى مئات من قيم الألوان المختلفة. في الواقع ، قد يكون للصورة فقط 3 إلى 4 ألوان رئيسية. كيفية إزالة تلك الألوان المختلطة واستخراج الألوان الرئيسية لهذه 3 إلى 4. وفقًا لخصائص الصورة العامة ، لن تخلط الصورة قيم ألوان مختلفة عند الحدود من نفس اللون يمكن اعتبارها واحدة من خصائص الحافة للصورة. لذلك ، يمكن تحقيق مستخلص هذه وحدات البكسل المختلطة وفقًا لخوارزمية التدرج المتدرج البسيط للحصول على صفيف قيمة البكسل ، ثم مسح كل قيمة بكسل ، والبحث عن البيكسلات حول المعلمة RADIUS المحددة R ، وإيجاد صفر ، وقيمة نقطة البيكسل الأقرب إلى البيكسل المركز. بعد اكتمال المسح ، يمكن إخراج صفيف البكسل ، ثم يمكن الحصول على مسح الصفيف بشكل خطي للحصول على قيمة RGB اللون الرئيسية للصورة.
الثاني: خطوات التنفيذ
1. أدخل صفيف صورة إلى رمادي الصورة الملونة ؛
2. بالنسبة للصورة الرمادية ، احسب تدرج الصورة ، واستخدم مشغل SOBOL هنا ؛
3. لكل نقطة غير صفرية ، قم بالمسح ضمن نطاق نصف القطر R ، وابحث عن أقرب قيمة بكسل أصلية من الصفر ؛
4. ببساطة مسح الصفيف الذي تم الحصول عليه للحصول على اللون الرئيسي.
المعلمة R هي العثور على القيمة الأنسب وفقًا لسيناريوهات التطبيق المختلفة. من الناحية النظرية ، كلما كانت الصورة أكبر ، كلما كانت قيمة r أكبر ، وإلا فإن الخوارزمية ستكون غير دقيقة.
ثلاثة: الصورة الأصلية وتأثير التشغيل
الصورة الأصلية
بعد تشغيل الخوارزمية ، يتم استخراج أربعة ألوان رئيسية
الرابع: رمز مصدر تنفيذ الخوارزمية
public bufferedimage public removeBlendPixels (صورة bufferedImage ، int raidus) {int width = image.getWidth () ؛ ارتفاع int = image.getheight () ؛ int [] pixels = new int [width * height] ؛ getRGB (صورة ، 0 ، 0 ، العرض ، الارتفاع ، وحدات البكسل) ؛ // إنشاء معالجة resultbufferedImage resultImg = CreateCopTiLedEstimage (صورة ، خالية) ؛ setRGB (resultimg ، 0 ، 0 ، العرض ، الارتفاع ، وحدات البكسل) ؛ // إنشاء معالجة resultbufferedImage resultImg = CreateCopTiLedEstimage (صورة ، خالية) ؛ setRGB (resultimg ، 0 ، 0 ، العرض ، الارتفاع ، وحدات البكسل) ؛ // grayscale و byte byte [] GrayData = getGrayData (بكسل ، العرض ، الارتفاع) ؛ Byte [] BinaryData = getGrident (GrayData ، العرض ، الارتفاع) ؛ int index = 0 ؛ لـ (int row = 1 ؛ row <height - 1 ؛ row ++) {for (int col = 1 ؛ col <width - 1 ؛ col ++) {index = row * width+col ؛ int pixel = (BinaryData [index] & 0xff) ؛ if (pixel> 0) {// RADIUS SCAN OPERATE int mindis = integer.max_value ؛ int minrow = -1 ؛ int mincol = -1 ؛ int nr = 0 ؛ int nc = 0 ؛ int index2 = 0 ؛ لـ (int subrow = -raidus ؛ subrow <= raidus ؛ subrow ++) {nr = row+subrow ؛ if (nr <0 || nr> = height) {contert ؛ } لـ (int subcol = -raidus ؛ subcol <= raidus ؛ subcol ++) {nc = col+subcol ؛ if (nc <0 || nc> = width) {contert ؛ } 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 = المسافة ؛ minrow = nr ؛ mincol = nc ؛ }}}} resultimg.setrgb (col ، row ، image.getrgb (mincol ، minrow)) ؛ }}} return resultimg ؛ } static int distancecolor (int rgb ، int rgb2) {// color One int r1 = (rgb >> 16) & 0xff ؛ int g1 = (rgb >> 8) & 0xff ؛ int b1 = rgb & 0xff ؛ // color two 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) ؛ إرجاع مجموع } البايت الثابت العام [] getGrayData (int [] inpixels ، عرض int ، ارتفاع int) {// صورة grayscale byte [] outpixels = new byte [width * height] ؛ int index = 0 ؛ لـ (int row = 0 ؛ row <height ؛ row ++) {int tr = 0 ، tg = 0 ، tb = 0 ؛ لـ (int col = 0 ؛ col <width ؛ col ++) {index = row * width+col ؛ tr = (inpixels [index] >> 16) & 0xff ؛ tg = (inpixels [index] >> 8) & 0xff ؛ tb = inpixels [index] & 0xff ؛ int gray = (int) (0.299 * tr + 0.587 * tg + 0.114 * tb) ؛ OutPixels [index] = (byte) (Gray & 0xff) ؛ }} إرجاع OutPixels ؛ } البايت الثابت العام [] getGrident (byte [] inpixels ، عرض int ، int leight) {byte [] outpixels = new byte [width * height] ؛ int index = 0 ؛ لـ (int row = 0 ؛ row <height ؛ row ++) {int tr = 0 ؛ لـ (int col = 0 ؛ col <width ؛ col ++) {if (row == 0 || col == 0 || (row == height - 1) || (col == width - 1)) {index = row * width+col ؛ OutPixels [index] = (byte) (0x00) ؛ يكمل؛ } int xg = 0 ، yg = 0 ؛ لـ (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) (clamp (g) & 0xff) ؛ }} إرجاع OutPixels ؛ } القيم الثابتة التي يجب تحديدها هي كما يلي:
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}} ؛ الثابت العام int block_pixel_radius = 5 ؛ استخدام التدرج يستخدم مشغل SOBOL. الكود لمسح كائن BufferEdImage بعد المعالجة للحصول على اللون الرئيسي هو كما يلي:
int width = result.getWidth () ؛ ارتفاع int = result.getheight () ؛ الخريطة <integer ، integer> colorIndExMap = new hashmap <integer ، integer> () ؛ لـ (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) ؛ }}} // الآن فحص قيمة pixel // return return system.out.println ("عدد color =" + colorindexmap.size ()) ؛ إرجاع colorindexmap.keyset (). tararray (عدد صحيح جديد [0]) ؛ رمز الاختبار كما يلي:
public static void main (string [] args) {file file = new file ("d: //gloomyfish//bigmonkey.png") ؛ file resultfile = ملف جديد ("d: //gloomyfish//result.png") ؛ حاول {bufferedImage Image = imageio.read (file) ؛ نتيجة bufferedImage = removeBlendPixels (صورة ، block_pixel_radius) ؛ imageio.write (نتيجة ، "png" ، resultfile) ؛ عدد صحيح [] الألوان = المستخلصات (النتيجة) ؛ System.out.println ("Total Colors:" + Colors.Length) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}ملاحظة: المفتاح الرئيسي هو إدخال الحجم الصحيح للصورة المراد معالجتها. يرتبط هذا الحجم نصف القطر بالحجم الفعلي للصورة ، ويمكن تحسين الخوارزمية خطوة واحدة إلى إصدار لا تعتمد على معلمة نصف القطر ، حتى تجد بكسل يساوي الصفر.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.