[OpenCV学习日记-java]-04-Mat对象通道与算术操作

Mat对象通道操作

图像通道分离

实现代码如下

split(Mat m,List<Mat> mv)//通道分离

下面用一段代码展示

获取Mat对象的channels之后 如果通道数目大于1 那么就可以使用通道分离

//首先获取图像的通道数 宽度 和 高度
int channels = m1.channels();
if(channels>1){
    List<Mat> ms = new ArrayList<>();//Mat集合
    Core.split(m1,ms);//通道分离
    int i = 0;//下标
    for (Mat mat  : ms){
        HighGui.imshow(String.valueOf(i++)+"通道",mat);
    }
}

运行结果:
在这里插入图片描述


图像通道合并

实现代码如下

merge(List<Mat> mv,Mat dst)//通道合并

下面用代码展示上面分离的通道合并了

Mat hebing = new Mat();//创建对象
Core.merge(ms,hebing);//合并通道

HighGui.imshow("通道合并后",hebing);//展示

在这里插入图片描述


算术操作

Mat对象可以进行 加 减 乘 除 运算,最常用的方法如下

add(Mat src1,Mat src2 ,Mat dst)
subtract(Mat src1,Mat src2 ,Mat dst)
multiply(Mat src1,Mat src2 ,Mat dst)
divide(Mat src1,Mat src2 ,Mat dst)

参数解释:

  • src1 : 输入的第一个Mat对象
  • src2 : 输入的第二个Mat对象
  • dst: 操作后输出的对象

src2的参数还可以是个Scalar对象(纯色)

当src1和src2都为Mat的时候 需要注意的是 他们两个图像的大小类型必须一致

下面我通过一个例子演示

Mat m1 = Imgcodecs.imread("C:\\test\\256_256_t1.png" );
Mat m2 = Imgcodecs.imread("C:\\test\\256_256_t2.png" );
//读入的两张尺寸一模一样的
HighGui.imshow("256_256_t1.jpg",m1);
HighGui.imshow("256_256_t2.jpg",m2);

//加法运算
Mat dst1 = new Mat();
Core.add(m1,m2,dst1);
HighGui.imshow("加法运算",dst1);
//减法运算
Mat dst2 = new Mat();
Core.subtract(m1,m2,dst2);
HighGui.imshow("减法运算",dst2);
//乘法运算
Mat dst3 = new Mat();
Core.multiply(m1,m2,dst3);
HighGui.imshow("乘法运算",dst3);
//除法运算
Mat dst4 = new Mat();
Core.divide(m1,m2,dst4);
HighGui.imshow("除法运算",dst4);

至于运算结果…
可能是我太文盲了 实在想不到有啥用
感觉只有加减可以用用,乘除就不知道了…
在这里插入图片描述
不过后来我有试了试纯颜色的Scalar对象

这里总算是看到了一丝丝希望,不在感觉乘除没啥用似的

在这里插入图片描述
下面是实现代码

Mat m1 = Imgcodecs.imread("C:\\test\\256_256_t1.png" );

Scalar m2 = new Scalar(10,10,10);

HighGui.imshow("256_256_t1.jpg",m1);
//加法运算
Mat dst1 = new Mat();
Core.add(m1,m2,dst1);
HighGui.imshow("加法运算",dst1);
//减法运算
Mat dst2 = new Mat();
Core.subtract(m1,m2,dst2);
HighGui.imshow("减法运算",dst2);
//乘法运算
Mat dst3 = new Mat();
Core.multiply(m1,m2,dst3);
HighGui.imshow("乘法运算",dst3);
//除法运算
Mat dst4 = new Mat();
Core.divide(m1,m2,dst4);
HighGui.imshow("除法运算",dst4);

调整亮度和对比度

图像的连读和对比度是图像的两个基本的属性,

  • 亮度 对RGB色彩来说,对应的RGB值越大,越接近于255 反之越小越接近于0

  • 对比度 描述图像颜色之间的差异

亮度 : 使用上面介绍的加减法操作
对比度 : 使用乘除法

调整亮度就是把上面的m2 使用 Scalar 对象(第二次示范那个)

噗!!! 合着上面几个算术操作就是为了调整亮度和对比度

得了 代码和图我也就不发了,都是上面的东西!!!


基于权重的图像叠加

光是单纯的加减乘除操作满足不了我们的需求,所以Opencv提供了基于权重的图像叠加的Api

addWeighted(Mat src1,double alpha,Mat src2 ,double beta,double gamma,Mat dst)
  • src1 : 输入的第一个Mat对象
  • alpha : 第一个Mat所占权重大小
  • src2 : 输入的第二个Mat对象
  • beta : 第二个Mat对象占权重大小
  • gamma : 混合之后是否进行亮度矫正(提升或降低)
  • dst : 图像输出

权重满足的条件为: alpha + beta = 1
通常 alpha = beta = 0.5 各占一半

假设src2是全黑色背景 那么这种各占一半的很明显会让图像变更加暗对比度更加低

我们把 alpha值调整为 1.5 , beta 调整为-0.5 这样最终得到的效果会有提升

如果gamma 不是默认值0 而是一个正整数 那么 则会提升亮度

这个方法的计算公式 : dst = src1*alpha + src2*beta + gamma

下面使用代码操作

Mat m1 = Imgcodecs.imread("C:\\test\\256_256_t1.png" );
Mat m2 = Imgcodecs.imread("C:\\test\\256_256_t2.png" );

HighGui.imshow("256_256_t1.jpg",m1);
HighGui.imshow("256_256_t2.jpg",m2);

Mat show = new Mat();
Core.addWeighted(m1,0.5,m2,0.5,0,show);//标准权重占比

HighGui.imshow("合体!!!",show);

Mat s = new Mat();
Core.addWeighted(m1,0.8,m2,0.2,0,s);//第一个图片权重大

HighGui.imshow("不公平合体!!!",s);

HighGui.waitKey();

在这里插入图片描述

Mat的其他操作

取反
bitwise_not(Mat src, Mat dst);
  • src 输入图像
  • dst 输出图像
与操作
bitwise_and(Mat src1, Mat src2, Mat dst);
  • src1 输入图像1
  • src2 输入图像2
  • dst 输出图像
或操作
bitwise_or(Mat src1, Mat src2, Mat dst);
  • src1 输入图像1
  • src2 输入图像2
  • dst 输出图像
异或操作
bitwise_xor(Mat src1, Mat src2, Mat dst);
  • src1 输入图像1
  • src2 输入图像2
  • dst 输出图像

Mat m1 = Imgcodecs.imread("C:\\test\\256_256_t1.png" );
Mat m2 = Imgcodecs.imread("C:\\test\\256_256_t2.png" );

HighGui.imshow("256_256_t1.jpg",m1);
HighGui.imshow("256_256_t2.jpg",m2);

Mat s1 = new Mat();
Core.bitwise_not(m1, s1);
Mat s2 = new Mat();
Core.bitwise_and(m1,m2,s2);
Mat s3 = new Mat();
Core.bitwise_or(m1,m2,s3);
Mat s4 = new Mat();
Core.bitwise_xor(m1,m2,s4);

HighGui.imshow("not",s1);
HighGui.imshow("and",s2);
HighGui.imshow("or",s3);
HighGui.imshow("xor",s4);

HighGui.waitKey();

在这里插入图片描述
运行结果图片我也发出来了


上一篇[OpenCV学习日记-java]-03-Mat对象像素操作
下一篇[OpenCV学习日记-java]-05-模糊
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Timeless小帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值