Hướng dẫn Xử lý ảnh trong Java với OpenCV

Ngày đăng: 22/06/2020   -    Cập nhật: 22/06/2020
Bài viết này mình sẽ cùng bạn tìm hiểu một chút về Xử lý ảnh trong Java. Hi vọng nó giúp ích cho bạn nếu bạn đang tìm hiểu về phần này.

Xử lý ảnh là một phân ngành khoa học rất phát triển trong những năm gần đây. Xử lý ảnh gồm 4 lĩnh vực chính:


  • Nâng cao chất lượng ảnh
  • Nhận dạng ảnh
  • Nén ảnh
  • Và Truy vấn ảnh.

Sự phát triển của xử lý ảnh đã đem lại rất nhiều lợi ích cho cuộc sống của con người.

Ngày nay xử lý ảnh được áp dụng rất rộng rãi trong đời sống như: Photoshop, các phần mềm nhận dạng biển số xe, nhận diện khuôn mặt, nhận dạng chữ viết, xử lý ảnh thiên văn, ảnh y tế,....

Các thuật toán về xử lý ảnh thường rất phức tạp, kể cả việc tưởng chừng đơn giản như nén ảnh để giảm dung lượng lưu trữ mà vẫn giữ được chất lượng ảnh tốt cũng là vấn đề hóc búa.

Có rất nhiều bạn đang không rõ về lĩnh vực này nên trong bài viết mình sẽ giới thiệu sơ lược về xử lý ảnh với Java (có sử dụng thư viện OpenCV).


Hướng dẫn xử lý ảnh trong Java với thư viện OpenCV

Hướng dẫn xử lý ảnh trong Java với thư viện OpenCV

Hy vọng qua bài này phần nào giúp các bạn có cái nhìn tổng quan về lĩnh vực Xử lý ảnh và có thêm hiểu biết về ngôn ngữ Java.

> Tham khảo: Khóa học Java Full stack nếu bạn là người mới bắt đầu.


Hướng dẫn xử lý ảnh trong Java qua ví dụ đơn giản



Việc xử lý một bức ảnh bất kỳ mà nói thì có vô vàn phương thức và cách xử lý.

Nó là tổ hợp kiến thức của cả một phân ngành, cả một môn học thậm chí là một lĩnh vực dành cho những ai đi chuyên sâu.

Trong các IDE, Java cũng đã cung cấp nhiều phương thức để hỗ trợ cho việc xử lý ảnh được thuận tiện hơn và bớt lệ thuộc vào thư viện bên ngoài.

Nhưng ở mức độ cơ bản, chúng ta có thể xem qua một số ví dụ để thấy được cái hay của lĩnh vực này.


Ví dụ #1: Chuyển một bức ảnh có gam màu chuẩn sang một màu khác.

 

Để thực hiện việc chuyển màu này, bạn cần chuẩn bị một hình ảnh để code mình viết ra có cái mà chuyển, ở đây mình hình của mình lưu ở F:\\content-niit\\image-to-process.jpg.

Bạn thử chạy chương trình bên dưới và kiểm tra lại xem kết quả sau khi xử lý ảnh nó như thế nào?

Phần giải thích code mình đã chú thích theo dạng code comment rồi nhé.

 


package image;

import java.io.File;
import java.io.IOException;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

public class GrayConvert {
    public static void main(String args[]) throws IOException {
        BufferedImage img = null;
        File f = null;

        // đọc hình ảnh từ máy tính
        try {
            f = new File("F:\\content-niit\\image-to-process.jpg");
            img = ImageIO.read(f);
        } catch (IOException e) {
            System.out.println(e);
        }

        // lấy chiều cao và chiều rộng của ảnh
        int width = img.getWidth();
        int height = img.getHeight();

        // chuyển đổi sang màu xám
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                // x,y là toạ độ của ảnh để sửa các giá trị pixel
                int p = img.getRGB(x, y);

                int a = (p >> 24) & 0xff;
                int r = (p >> 16) & 0xff;
                int g = (p >> 8) & 0xff;
                int b = p & 0xff;

                // tính giá trị trung bình
                int avg = (r + g + b) / 3;

                // thay RGB bằng giá trị avg vừa tính được
                p = (a << 24) | (avg << 16) | (avg << 8) | avg;

                img.setRGB(x, y, p);
            }
        }

        // lưu ảnh
        try {
            f = new File("F:\\content-niit\\image-processed.jpg");
            ImageIO.write(img, "jpg", f);
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}
 

Ví dụ #2. Tăng độ tương phản cho ảnh.



Chúng ta cùng thử với cùng một nguồn ảnh (F:\\content-niit\\image-to-process.jpg) như ví dụ trên nhé.

Từ ví dụ này trở đi, bạn nên tìm hiểu cách import cũng như sử dụng thư viện OpenCV trong các dự án của mình.



package image;

// import thư viện opencv
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;


public class EnhancingContrast {
    static int width;
    static int height;
    static double alpha = 2;
    static double beta = 50;

    public static void main(String[] args) {
        try {
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
            Mat source = Highgui.imread("F:\\content-niit\\image-to-process.jpg ",
                            Highgui.CV_LOAD_IMAGE_GRAYSCALE);
            Mat destination = new Mat(source.rows(), source.cols(), source.type());
            Imgproc.equalizeHist(source, destination);
            Highgui.imwrite("F:\\content-niit\\image-enhanced.jpg ", destination);
        } catch (Exception e) {
            System.out.println("error: " + e.getMessage());
        }
    }
}
 

Ví dụ #3. Nhận diện khuôn mặt với thư viện OpenCV trong Java.


Chắc các bạn đã từng nghe nhiều đến công nghệ nhận diện khuôn mặt, nhưng không phải ai cũng biết nó được viết ra như thế nào.

Vậy hôm nay, chúng ta cùng tìm hiểu xem, Java nhận diện khuôn mặt như thế nào nhé.



package image;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

public class FaceDetection {
    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        CascadeClassifier faceDetector = new CascadeClassifier();
        faceDetector.load("haarcascade_frontalface_alt.xml");
        Mat image = Imgcodecs.imread("F:\\content-niit\\image-to-process.jpg");
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(image, faceDetections);
        for (Rect rect : faceDetections.toArray()) {
            Imgproc.rectangle(image, new Point(rect.xrect.y),
                new Point(rect.x + rect.widthrect.y + rect.height),
                new Scalar(02550));
        }
        String filename = "F:\\content-niit\\image-detected.jpg";
        Imgcodecs.imwrite("F:\\" + filename, image);
    }
}
 
 
Nhận diện khuôn mặt tưởng khó hoá ra code cũng không dài ngoằn nghoèo như bạn nghĩ đúng không.

Bởi lẽ phần lớn công việc đã được hỗ trợ bởi thư viện OpenCV rồi, đây là công cụ hỡ trợ cực kỳ mạnh mẽ không thể thiếu đối với các nhà lập trình chuyên về xử lý ảnh.


Kết luận


Chúng ta đã điểm qua vài ví dụ về các tính năng xử lý ảnh trong Java. Nó là một lĩnh vực thú vị và rất đáng chú ý trong thời điểm hiện tại.

Việc tìm hiểu và thông thạo về lĩnh vực này là cơ hội rộng mở đối với lập trình viên Java nói chung và những ai muốn đi theo chuyên ngành này nói riêng.

Xử lý ảnh đã dần khẳng định và đóng góp vai trò quan trọng trong hầu hết các lĩnh vực đời sống, nếu bạn thấy thú vị hoặc muốn khám phá sâu về chuyên ngành này hãy bắt đầu ngay để đón kịp xu thế.

Trong phạm vi bài viết, mình có nói và sử dụng qua OpenCV – đây là công cụ và cũng là trợ thủ đắc lực giúp bạn thực hiện các công việc xử lý ảnh một cách đơn giản hơn.

Hẹn các bạn ở bài khác, chúng ta sẽ nói nhiều về thư viện OpenCV này nhé.



Tham khảo: https://www.tutorialspoint.com/java_dip/index.htm

---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Dạy học Lập trình chất lượng cao (Since 2002). Học làm Lập trình viên. Hành động ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0914939543 - 0353655150 
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python
Bình luận Facebook
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!