עבודה עם תמונות בג'אווה

1. סקירה כללית

במדריך זה אנו נסתכל על כמה ספריות זמינות לעיבוד תמונה, ולבצע פעולת עיבוד תמונה פשוטה - העמסת תמונה וציור עליה צורה.

ננסה את ספריית AWT (וקצת סווינג), ImageJ, OpenIMAJ ו- TwelveMonkeys.

2. AWT

AWT היא ספריית ג'אווה מובנית המאפשרת למשתמש לבצע פעולות פשוטות הקשורות לתצוגה, כמו יצירת חלון, הגדרת כפתורים ומאזינים וכן הלאה. הוא כולל גם שיטות המאפשרות למשתמש לערוך תמונות. זה לא דורש התקנה מכיוון שהוא נשלח עם Java.

2.1. טוען תמונה

הדבר הראשון הוא ליצור BufferedImage אובייקט מתמונה שנשמרה בכונן הדיסק שלנו:

מחרוזת imagePath = "path / to / your / image.jpg"; BufferedImage myPicture = ImageIO.read (קובץ חדש (imagePath)); 

2.2. עריכת תמונה

כדי לצייר צורה על תמונה, נצטרך להשתמש גרָפִיקָה אובייקט הקשור לתמונה טעונה. גרָפִיקָה האובייקט מכיל תכונות הדרושות לביצוע פעולות עיבוד בסיסיות. Graphics2D הוא כיתה המרחיבה גרָפִיקָה. הוא מספק שליטה רבה יותר על צורות דו ממדיות.

במקרה הספציפי הזה, אנחנו צריכים Graphic2D כדי להאריך את רוחב הצורה כדי שיהיה גלוי בבירור. אנו משיגים זאת על ידי הגדלת ה- s שלושבץ תכונה. לאחר מכן אנו קובעים צבע ומציירים מלבן באופן שהצורה תהיה עשרה פיקסלים מגבולות התמונה:

Graphics2D g = (Graphics2D) myPicture.getGraphics (); g.setStroke (BasicStroke חדש (3)); g.setColor (Color.BLUE); g.drawRect (10, 10, myPicture.getWidth () - 20, myPicture.getHeight () - 20); 

2.3. הצגת תמונה

עכשיו, לאחר שציירנו משהו על התמונה שלנו, נרצה להציג אותה. אנו יכולים לעשות זאת באמצעות אובייקטים של ספריית Swing. ראשית, אנו יוצרים JLabel אובייקט המייצג אזור תצוגה לטקסט או / ותמונה:

JLabel picLabel = JLabel חדש (ImageIcon חדש (myPicture));

ואז הוסף את שלנו JLabel ל ג'פנל, שאנו יכולים להתייחס אליהם כ GUI מבוסס Java:

JPanel jPanel = JPanel חדש (); jPanel.add (picLabel);

בסופו של דבר, אנחנו מוסיפים הכל ל JFrame שהוא חלון המוצג על גבי מסך. עלינו להגדיר גודל כך שלא נצטרך להרחיב חלון זה בכל פעם שאנחנו מריצים את התוכנית שלנו:

JFrame f = JFrame חדש (); f.setSize (מימד חדש (myPicture.getWidth (), myPicture.getHeight ())); f.add (jPanel); f.setVisible (נכון);

3. ImageJ

ImageJ היא תוכנה מבוססת Java שנוצרה לעבודה עם תמונות. יש בו די הרבה תוספים, הזמינים כאן. אנו נשתמש ב- API בלבד, מכיוון שאנו רוצים לבצע עיבוד בעצמנו.

זוהי ספרייה חזקה למדי, טובה יותר מ- Swing ו- AWT, מכיוון שמטרת היצירה שלה הייתה עיבוד תמונות ולא פעולות GUI. תוספים מכילים אלגוריתמים רבים לשימוש חופשי, וזה דבר טוב כשאנחנו רוצים ללמוד עיבוד תמונה ולראות במהירות את התוצאות, במקום לפתור בעיות מתמטיקה ואופטימיזציה המונחות תחת אלגוריתמי IP.

3.1. תלות של Maven

כדי להתחיל לעבוד עם ImageJ, פשוט הוסף תלות בפרויקט שלך pom.xml קוֹבֶץ:

 net.imagej ij 1.51h 

תוכלו למצוא את הגרסה החדשה במאגר Maven.

3.2. טוען תמונה

כדי לטעון את התמונה, עליך להשתמש ב- openImage () שיטה סטטית, מ IJ מעמד:

ImagePlus imp = IJ.openImage ("נתיב / אל / שלך / image.jpg");

3.3. עריכת תמונה

כדי לערוך תמונה, נצטרך להשתמש בשיטות מ ImageProcessor אובייקט המצורף ל ImagePlus לְהִתְנַגֵד. תחשוב על זה בערך גרָפִיקָה אובייקט ב- AWT:

ImageProcessor ip = imp.getProcessor (); ip.setColor (Color.BLUE); ip.setLineWidth (4); ip.drawRect (10, 10, imp.getWidth () - 20, imp.getHeight () - 20);

3.4. הצגת תמונה

אתה צריך להתקשר רק הופעה() שיטה של ImagePlus לְהִתְנַגֵד:

imp.show ();

4. OpenIMAJ

OpenIMAJ מורכב מספריות Java המתמקדות לא רק בראיית מחשב ועיבוד וידאו, אלא גם למידת מכונה, עיבוד שמע, עבודה עם Hadoop ועוד ועוד. כל החלקים של פרויקט OpenIMAJ נמצאים כאן, תחת "מודולים". אנחנו צריכים רק את החלק של עיבוד התמונה.

4.1. תלות של Maven

כדי להתחיל לעבוד עם OpenIMAJ, פשוט הוסף תלות לפרויקטים שלך pom.xml קוֹבֶץ:

 org.openimaj image-core 1.3.5 

תוכלו למצוא את המהדורה האחרונה כאן.

4.1. טוען תמונה

כדי לטעון תמונה, השתמש ImageUtilities.readMBF () שיטה:

MBFImage image = ImageUtilities.readMBF (קובץ חדש ("path / to / your / image.jpg")); 

MBF מייצג את התמונה עם נקודה צפה של רב-פס (RGB בדוגמה זו, אך זו לא הדרך היחידה לייצג צבעים).

4.2. עריכת תמונה

כדי לצייר את המלבן, עלינו להגדיר את צורתו שהיא מצולע המורכב מ -4 נקודות (למעלה משמאל, למטה משמאל, למטה מימין, למעלה מימין):

Point2d tl = חדש Point2dImpl (10, 10); Point2d bl = Point2dImpl חדש (10, image.getHeight () - 10); Point2d br = Point2dImpl חדש (image.getWidth () - 10, image.getHeight () - 10); Point2d tr = Point2dImpl חדש (image.getWidth () - 10, 10); מצולע מצולע = מצולע חדש (Arrays.asList (tl, bl, br, tr));

כפי ששמתם לב, בעיבוד תמונה ציר Y הפוך. לאחר הגדרת הצורה, עלינו לצייר אותה:

image.drawPolygon (מצולע, 4, Float חדש [] {0f, 0f, 255.0f});

שיטת הציור כוללת 3 ארגומנטים: צורה, עובי קו וערכי ערוץ RGB המיוצגים על ידי לָצוּף מַעֲרָך.

4.3. הצגת תמונה

אנחנו צריכים להשתמש DisplayUtilities:

DisplayUtilities.display (תמונה);

5. TwelveMonkeysImageIO

ה TwelveMonkeysImageIO הספרייה מיועדת כתוסף ל- Java ImageIO API, עם תמיכה במספר גדול יותר של פורמטים.

לרוב, הקוד ייראה זהה לקוד הג'אווה המובנה, אך הוא יפעל עם פורמטי תמונה נוספים, לאחר הוספת התלות הדרושה.

כברירת מחדל, Java תומכת רק בחמשת הפורמטים האלה לתמונות: JPEG, PNG, BMP, WEBMP, GIF.

אם ננסה לעבוד עם קובץ תמונה בפורמט אחר, היישום שלנו לא יוכל לקרוא אותו ויזרוק א NullPointerException בעת גישה אל BufferedImage מִשְׁתַנֶה.

TwelveMonkeys מוסיף תומכים לפורמטים הבאים: PNM, PSD, רִיב, HDR, IFF, PCX, PICT, SGI, TGA, ICNS, ICO, CUR, אגודלים.db, SVG, WMF.

כדי לעבוד עם תמונות בפורמט ספציפי, עלינו להוסיף את התלות המתאימה, כגון imageio-jpeg או imageio-tiff.

תוכל למצוא את רשימת התלות המלאה בתיעוד של TwelveMonkeys.

בואו ליצור דוגמא שקוראת א .יקו תמונה. הקוד ייראה זהה ל- AWT קטע, אלא שאנו נפתח תמונה אחרת:

מחרוזת imagePath = "path / to / your / image.ico"; BufferedImage myPicture = ImageIO.read (קובץ חדש (imagePath));

כדי שהדוגמה הזו תעבוד, עלינו להוסיף את ה- TwelveMonkeys תלות המכילה תמיכה ב .יקו תמונות, שהיא התלות של imageio-bmp, יחד עם התלות של imageio-core:

 com.twelvemonkeys.imageio imageio-bmp 3.3.2 com.twelvemonkeys.imageio imageio-core 3.3.2 

וזה הכל! המובנה ImageIO Java API טוען את התוספים באופן אוטומטי בזמן הריצה. עכשיו הפרויקט שלנו יעבוד איתו .יקו גם תמונות.

6. סיכום

הוצגו בפניך 4 ספריות שיכולות לעזור לך לעבוד עם תמונות. בהמשך הדרך, כדאי לחפש כמה אלגוריתמים לעיבוד תמונה, כמו חילוץ קצוות, שיפור הניגודיות, שימוש במסננים או בזיהוי פנים.

למטרות אלה, עדיף להתחיל ללמוד ImageJ או OpenIMAJ. קל לכלול את שניהם בפרויקט והם הרבה יותר חזקים מ- AWT בנוגע לעיבוד תמונה.

דוגמאות לעיבוד תמונה אלה ניתן למצוא בפרויקט GitHub.


$config[zx-auto] not found$config[zx-overlay] not found