09-基本图像运算
基本图像运算
1、图像加法;
2、图像减法;
3、图像乘除;
4、图像逻辑运算: 与、或、非、取反、异或;
图像加法
1、API : Add()
两张图像直接相加;
2、API : AddWeighted()
: 按照权重相加;dst = a * src1 + b * src2 + gamma;
3、注意:图像像素值相加超过255后会被截断;
4、注意:图像进行加法操作前必须保证两幅图像的大小和位深度完全相同;
图像减法
1、API : CvInvoke.Subtract()
: 两张图像像素做减法,如果结果小于0,则取0(截断,信息丢失);
2、API : CvInvoke.AbsDiff()
: 两张图像像素做减法,如果结果小于0,则取绝对值(信息保留);
图像乘除(multiply、divide)
1、C++/Python中矩阵乘除允许 * ,/ 运算符之间操作,EmguCV中不支持,必须使用函数调用;
//创建临时矩阵用于图像乘除
temp.SetTo(new MCvScalar(1,5,1)) ; //乘法则 B分量不变,G分量 * 5 ;R分量不变; 除法则相反
图像逻辑运算(逻辑与、或、非、异或)
注意:进行图像逻辑运算的图片需要具有相同的大小和位深度;
逻辑运算原理:
Image1 在一点像素值为100,Image2在同一点像素值为10,其逻辑运算为: 将100,10均转换为二进制,再进行逻辑运算,得到二进制结果,最后在转换为十进制即为逻辑运算的结果;
1、与(&):CvInvoke.BitwiseAnd()
;(两张图片)
保留高亮部分:
2、或(|) : CvInvoke.BitwiseOr()
;(两张图片)
3、取反(!/~): CvInvoke.BitwiseNot()
;(一张图片)
原理:
彩色图像像素值先转换为二进制,然后进行取反运算,得出结果后再转换为10进制;
4、异或(^) : CvInvoke.BitwiseXor()
;
原理:
相同为1,不同为0,用来求两幅图像不同的区域,不同的区域高亮进行显示;
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using System.Drawing;
namespace lesson9
{
class Program
{
static void Main(string[] args)
{
Mat src1 = new Mat("c:/users/hello/desktop/15.jpg");
Mat src2 = new Mat("c:/users/hello/desktop/16.jpg");
Mat dst = new Mat();
//CvInvoke.Add(src1, src2, dst);
//CvInvoke.AddWeighted(src1, 0.8, src2, 0.2, 0, dst);
//CvInvoke.Subtract(src1, src2, dst);
//CvInvoke.AbsDiff(src1, src2, dst);
//创建待乘待除矩阵
Mat temp = new Mat(src1.Size, DepthType.Cv8U, 3);
temp.SetTo(new MCvScalar(5, 5, 5)); // B * ? ; G * ? ; R * ?
//CvInvoke.Multiply(src1, temp, dst,1); // 1 : scale: 放大倍数
//CvInvoke.Divide(src1, temp, dst, 1);
//CvInvoke.BitwiseAnd(src1, src2, dst);
//CvInvoke.BitwiseOr(src1, src2, dst);
//CvInvoke.BitwiseNot(src1, dst);
CvInvoke.BitwiseXor(src1, src2, dst);
CvInvoke.Imshow("out put1", dst);
CvInvoke.WaitKey(0);
}
}
}
效果
Subtract:
AbsDiff :