1 Star 2 Fork 2

Johnny-Q / Java-opencv

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
OpencvGrayImage.java 4.55 KB
一键复制 编辑 原始数据 按行查看 历史
Johnny-Q 提交于 2024-04-18 16:35 +08:00 . 灰度变换
package com.zhou.opencv.example;
import com.zhou.opencv.example.common.ListDisplayPanel;
import com.zhou.opencv.example.utils.BufferImageUtil;
import com.zhou.opencv.example.utils.ShowImages;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
/**
* 图像灰度变换
*
* @author zhoucq
* @date 2023/10/25
*/
public class OpencvGrayImage {
private static final String imageResultPath = "image/result/";
private static final String imagePath = "image/cat.jpg";
public static void main(String[] args) throws Exception {
//取消热部署,防止opencv加载报错,没有热部署可忽略
System.setProperty("spring.devtools.restart.enabled", "false");
//加载绝对路径下的dll
System.load("E:\\workspace\\opencv\\lib\\opencv_java455.dll");
grayImage(imagePath);
}
/**
* opencv自带HighGui显示图片
*
* @param filePath
* @throws Exception
*/
public static void showImage(String filePath) throws Exception {
ListDisplayPanel gui = new ListDisplayPanel();
//读取图片
Mat src = Imgcodecs.imread(filePath, Imgcodecs.IMREAD_COLOR);
//创建显示窗口,不加这行代码,也能显示,默认窗口大小不能改变
HighGui.namedWindow("原图");
//在窗口显示图像
HighGui.imshow("原图", src);
//检测图像是否加载成功
if (src.empty()) {
System.out.println("not find the image");
return;
}
File file = new File(imageResultPath);
if (!file.isDirectory()) {
if (!file.mkdirs()) {
throw new Exception("文件夹创建失败:" + imageResultPath);
}
}
//图像保存
Imgcodecs.imwrite(String.format(imageResultPath + "save.jpg"), src);
//暂停,保持图像显示,等待按键结束
HighGui.waitKey(0);
}
/**
* 灰度三种测试,opencv默认是加权平均值法
*
* @throws IOException
*/
public static void grayImage(String filePath) throws IOException {
ListDisplayPanel gui = new ListDisplayPanel();
Mat src = Imgcodecs.imread(filePath, Imgcodecs.IMREAD_COLOR);
//检测图像是否加载成功
if (src.empty()) {
System.out.println("not find the image");
return;
}
gui.addImage("原图", BufferImageUtil.mat2BufferedImage(src));
//自定义空白单通道图像,用于存放灰度图
Mat dst = new Mat(src.size(), CvType.CV_8UC1);
dst.setTo(new Scalar(255, 255, 255));
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
gui.addImage("opencv默认灰度", BufferImageUtil.mat2BufferedImage(dst));
for (int row = 0; row < src.rows(); row++) {
for (int col = 0; col < src.cols(); col++) {
if (src.channels() == 3) {
double[] colors = src.get(row, col);
//加权平均值法D=0.299R+0.587G+0.114*B
double color = colors[0] * 0.114 + colors[1] * 0.587 + colors[2] * 0.299;
dst.put(row, col, color);
}
}
}
gui.addImage("加权平均值法", BufferImageUtil.mat2BufferedImage(dst));
//平均值法
for (int row = 0; row < src.rows(); row++) {
for (int col = 0; col < src.cols(); col++) {
if (src.channels() == 3) {
double[] colors = src.get(row, col);
double color = Math.floorDiv((long) (colors[0] + colors[1] + colors[2]), 3);
dst.put(row, col, color);
}
}
}
gui.addImage("平均值法", BufferImageUtil.mat2BufferedImage(dst));
//最大值
for (int row = 0; row < src.rows(); row++) {
for (int col = 0; col < src.cols(); col++) {
if (src.channels() == 3) {
double[] colors = src.get(row, col);
Double color = Arrays.stream(colors).boxed().max(Comparator.comparing(x -> x)).orElse(null);
dst.put(row, col, color);
}
}
}
gui.addImage("最大值法", BufferImageUtil.mat2BufferedImage(dst));
ShowImages.showWindow(gui, "灰度的三种测试", true);
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/ALR/java-opencv.git
git@gitee.com:ALR/java-opencv.git
ALR
java-opencv
Java-opencv
master

搜索帮助