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 :
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章