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

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:

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).Sự tăng trưởng của giải quyết và xử lý ảnh đã đem lại rất nhiều quyền lợi cho đời sống của con người. Ngày nay giải quyết và xử lý ảnh được vận dụng rất thoáng rộng trong đời sống như : Photoshop, những ứng dụng nhận dạng biển số xe, nhận diện khuôn mặt, nhận dạng chữ viết, giải quyết và xử lý ảnh thiên văn, ảnh y tế, …. Các thuật toán về giải quyết và xử lý ảnh thường rất phức tạp, kể cả việc tưởng chừng đơn thuần như nén ảnh để giảm dung tích tàng trữ mà vẫn giữ được chất lượng ảnh tốt cũng là yếu tố hóc búa. Có rất nhiều bạn đang không rõ về nghành này nên trong bài viết mình sẽ trình làng sơ lược về ( có sử dụng thư viện ) .

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

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

> Tham khảo: Khóa học Java Full stack nếu bạn là người mới bắt đầu.Hy vọng qua bài này phần nào giúp những bạn có cái nhìn tổng quan về nghành Xử lý ảnh và có thêm hiểu biết về ngôn từ Java .

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();

        / / quy đổi sang màu xám

        for (int y = 0; y < height; y++) {

            for (int x = 0; x < width; x++) {

                / / x, y là tọa độ của ảnh để sửa những giá trị px

                int p = img.getRGB(x, y);

                int a = (p >> 24) & 0 xff;

                int r = (p >> 16) & 0 xff;

                int g = (p >> 8) & 0 xff;

                int b = p & 0 xff;

                / / 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.x, rect.y),

                new Point(rect.x + rect.width, rect.y + rect.height),

                new Scalar(0, 255, 0));

}

        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, CG cầu giấy, Thành Phố Hà Nội

SĐT : 02435574074 – 0914939543 – 0353655150

E-Mail : [email protected]

Fanpage: https://facebook.com/NIIT.ICT/

# niit # niithanoi # niiticthanoi # hoclaptrinh # khoahoclaptrinh # hoclaptrinhjava # hoclaptrinhphp # java # php # python