5.1彩色图像转灰度图
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