Java OpenCV数字图像处理——灰度化
·
【OpenCV】灰度化
Java OpenCV数字图像处理——灰度化
图像处理的第一步操作基本都是进行灰度化,基本分为三大种,分别为加权平均值灰度化、最大值灰度化、平均值灰度化。
一、灰度的概念
在数字图像中,像素是基本的表示单位,各个像素的亮安程度用灰度值来标识,只含亮度信息,不含色彩信息的图像称为灰度图像,对于单色图像,它的每个像素的灰度值用【0,255】区间的整数表示,即图像分为256个灰度等级,对于彩色图像,他的每个像素由R,G,B三个单色调配而成,如果每个像素的R,G,B完全相同,也就是R=G=B=D,该图像就是灰度图像,D为图像的灰度值,此时图像可以为单通道图像,所有像素值为D;
二、代码示例
原图
1、加权平均值 D=0.299R+0.587G+0.114*B
/**
* 灰度三种测试,opencv默认是加权平均值法
*
* @throws IOException
*/
public static void main(String[] args) {
Mat src = Imgcodecs.imread("image/cat.jpg", Imgcodecs.IMREAD_COLOR);
HighGui.imshow("原图", src);
//检测图像是否加载成功
if (src.empty()) {
System.out.println("not find the image");
return;
}
//自定义空白单通道图像,用于存放灰度图
Mat dst = new Mat(src.size(), CvType.CV_8UC1);
dst.setTo(new Scalar(255, 255, 255));
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
HighGui.imshow("灰度",dst);
//加权平均值法D=0.299R+0.587G+0.114*B
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 = colors[0] * 0.114 + colors[1] * 0.587 + colors[2] * 0.299;
dst.put(row, col, color);
}
}
}
HighGui.imshow("加权平均值法", dst.clone());
HighGui.waitKey(0);
System.exit(0);
}

2、平均值法D=(R+G+B)/3
/**
* 灰度三种测试,opencv默认是加权平均值法
*
* @throws IOException
*/
public static void main(String[] args) {
Mat src = Imgcodecs.imread("image/cat.jpg", Imgcodecs.IMREAD_COLOR);
HighGui.imshow("原图", src);
//检测图像是否加载成功
if (src.empty()) {
System.out.println("not find the image");
return;
}
//自定义空白单通道图像,用于存放灰度图
Mat dst = new Mat(src.size(), CvType.CV_8UC1);
dst.setTo(new Scalar(255, 255, 255));
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
HighGui.imshow("灰度",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);
}
}
}
HighGui.imshow("平均值法", dst.clone());
HighGui.waitKey(0);
System.exit(0);
}

3、最大值法
/**
* 灰度三种测试,opencv默认是加权平均值法
*
* @throws IOException
*/
public static void main(String[] args) {
Mat src = Imgcodecs.imread("image/cat.jpg", Imgcodecs.IMREAD_COLOR);
HighGui.imshow("原图", src);
//检测图像是否加载成功
if (src.empty()) {
System.out.println("not find the image");
return;
}
//自定义空白单通道图像,用于存放灰度图
Mat dst = new Mat(src.size(), CvType.CV_8UC1);
dst.setTo(new Scalar(255, 255, 255));
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
HighGui.imshow("灰度",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);
}
}
}
HighGui.imshow("最大值法", dst.clone());
HighGui.waitKey(0);
System.exit(0);
}

代码地址:Java-opencv
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)