【Java Opencv系列】5.1彩色图像转灰度

5.1彩色图像转灰度图

本节内容代码下载链接:http://download.csdn.net/detail/u012343179/9801552

Gray = R*0.299 + G*0.587 + B*0.114

在testOpencv项目下创建imageBasicProcess包,包下新建RgbtoGRayTest.java窗体应用和MyRgbtoGray.java类。


RgbtoGrayTest.java代码如下:

package imageBasicProcess;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;

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

import tool.mat2BufferedImage;

import java.awt.BorderLayout;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class RgbtoGrayTest {
	static{
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
	}

	private JFrame frame;
	Mat mrgb;

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

	/**
	 * Create the application.
	 */
	public RgbtoGrayTest() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(0, 0, 800, 600);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		JLabel lbl = new JLabel("New label");
		lbl.setBounds(0, 50, 500, 400);
		frame.getContentPane().add(lbl);
		
		JButton btn = new JButton("\u7070\u5EA6\u5316");
		btn.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				Mat mgray=new Mat(mrgb.rows(),mrgb.cols(),mrgb.type());
				Imgproc.cvtColor(mrgb, mgray, Imgproc.COLOR_RGB2GRAY);//Opencv中彩色转灰度的函数
				//mgray=MyRgbtoGray.rgbToGray(mrgb);
				lbl.setIcon(new ImageIcon(mat2BufferedImage.matToBufferedImage(mgray)));
			}
		});
		btn.setBounds(0, 0, 100, 30);
		frame.getContentPane().add(btn);
		
		//我们的操作
		mrgb=Imgcodecs.imread("F://lena.jpg",Imgcodecs.CV_LOAD_IMAGE_COLOR);
		lbl.setIcon(new ImageIcon(mat2BufferedImage.matToBufferedImage(mrgb)));
	}
}

运行结果:

原图:

点击按钮后:(灰度)


本节中最为重要的就是:

Imgproc.cvtColor(mrgb, mgray, Imgproc.COLOR_RGB2GRAY);//Opencv中彩色转灰度的函数

下面我们自己编码实现该效果:

MyRgbtoGray.java的代码如下:

package imageBasicProcess;

import org.opencv.core.CvType;
import org.opencv.core.Mat;

public class MyRgbtoGray {
	public static Mat rgbToGray(Mat mrgb){
		Mat mgray=new Mat(mrgb.rows(),mrgb.cols(),CvType.CV_8UC1);//一样大小的灰度图
		for(int i=0;i<mrgb.rows();i++){
			for(int j=0;j<mrgb.cols();j++){
				double[] value=mrgb.get(i, j);//BGR顺序
				double valueGray=0.114*value[0]+0.587*value[1]+0.299*value[2];//转换公式
				mgray.put(i, j, valueGray);
			}
		}
		return mgray;
	}
	
}

效果与opencv中的一致。

CommissarMa          2017年4月1日16:54:26



评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值