基本圖像運算
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 :