LoginSignup
1
0

More than 3 years have passed since last update.

OpenCV Contrast Use Equalize Hist For RBG

Posted at
Goal

Test OpenCV Equalize Hist with split RGB channel then merge to original image.

OpenCV_ContrastUseEqualizeHistForRBG.java
import java.awt.EventQueue;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class OpenCV_ContrastUseEqualizeHistForRBG {

    static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
    private JFrame frmjavaSwing;
    double alpha =2;
    double beta = 2;

    /**
     *  Launch the application.
     */
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try{
                    OpenCV_ContrastUseEqualizeHistForRBG window = new OpenCV_ContrastUseEqualizeHistForRBG();
                    window.frmjavaSwing.setVisible(true);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     *  Create the application.
     */
    public OpenCV_ContrastUseEqualizeHistForRBG(){
        init();
    }

    /**
     *  Init the contents of the frame.
     */
    private void init(){
        final Mat source = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\clean.jpg");

        BufferedImage image=matToBufferedImage(equalizeHist(source));

        frmjavaSwing = new JFrame();
        frmjavaSwing.setTitle("opencv彩色影像對比練習1");
        frmjavaSwing.setBounds(100, 100, 520, 550);
        frmjavaSwing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmjavaSwing.getContentPane().setLayout(null);

        final JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setBounds(10, 10, 438, 455);
        lblNewLabel.setIcon(new ImageIcon(image));
        frmjavaSwing.getContentPane().add(lblNewLabel);
    }

    public Mat equalizeHist(Mat source){
        Mat destination=new Mat(source.rows(),source.cols(),source.type());
        List<Mat> bgrList = new ArrayList<>(3);
        Core.split(source,  bgrList);
        Imgproc.equalizeHist(bgrList.get(0), bgrList.get(0));
        Imgproc.equalizeHist(bgrList.get(1), bgrList.get(1));
        Imgproc.equalizeHist(bgrList.get(2), bgrList.get(2));
        Core.merge(bgrList, destination);
        return destination;
    }

    public BufferedImage matToBufferedImage(Mat matrix) {
        int cols = matrix.cols();
        int rows = matrix.rows();
        int elemSize = (int)matrix.elemSize();
        byte[] data = new byte[cols * rows * elemSize];
        int type;
        matrix.get(0, 0, data);
        switch (matrix.channels()) {
            case 1:
                type = BufferedImage.TYPE_BYTE_GRAY;
                break;
            case 3:
                type = BufferedImage.TYPE_3BYTE_BGR;
                // bgr to rgb
                byte b;
                for(int i=0; i<data.length; i=i+3) {
                    b = data[i];
                    data[i] = data[i+2];
                    data[i+2] = b;
                }
                break;
            default:
                return null;
        }
        BufferedImage image2 = new BufferedImage(cols, rows, type);
        image2.getRaster().setDataElements(0, 0, cols, rows, data);
        return image2;
    }
}

opencv_contrast_use_equalize_hist_for_rgb.JPG

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0