rainit2006 / Artificial-Intelligence

1 stars 0 forks source link

OpenCV #21

Open rainit2006 opened 5 years ago

rainit2006 commented 5 years ago

rainit2006 commented 5 years ago

rainit2006 commented 5 years ago

西住工房 https://algorithm.joho.info/programming/python/opencv-sample-code-py/

Sample

rainit2006 commented 5 years ago

角点检测 Harris

OpenCV 中的函数 cv2.cornerHarris() 可以用来进行角点检测,参数如下: img - 输入图像。 blockSize - 角点检测中领域像素的大小。 ksize - Sobel 求导中使用的窗口大小 k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06]. 输出 response

Haar Cascade識別器

cascade = cv2.CascadeClassifier(path) face = cascade.detectMultiScale(src, scaleFactor, minNeighbors, minSize)

Template matching

//SSD match = cv2.matchTemplate(gray, temp, cv2.TM_SQDIFF) min_value, max_value, pt_min, pt_max = cv2.minMaxLoc(match) //マッチング結果配列を引数として与え、相関値の最大値、最小値、最小位置、最大位置を受け取る。

//SAD match = cv2.matchTemplate(gray, temp, cv2.TM_SQDIFF_NORMED) min_value, max_value, pt_min, pt_max = cv2.minMaxLoc(match)

//NCC match = cv2.matchTemplate(gray, temp,cv2.TM_CCORR_NORMED) min_value, max_value, pt_min, pt_max = cv2.minMaxLoc(match)

//ZNCC match = cv2.matchTemplate(gray, temp, cv2.TM_CCOEFF_NORMED) min_value, max_value, pt_min, pt_max = cv2.minMaxLoc(match)

Affine変換

R = cv2.getRotationMatrix2D((ox, oy), theta, scale) # 回転変換行列の算出 dst = cv2.warpAffine(gray, R, gray.shape, flags=cv2.INTER_CUBIC) # アフィン変換

閾値

ret, dst = cv2.threshold(src, threshold, max_value, threshold_type) cv2.adaptiveThreshold()

Integral Image

cv2.integral(image)

cv2.filter2D

Opencv提供的一个通用的2D滤波函数为cv2.filter2D(),滤波函数的使用需要一个核模板,对图像的滤波操作过程为:将和模板放在图像的一个像素A上,求与之对应的图像上的每个像素点的和,核不同,得到的结果不同,而滤波的使用核心也是对于这个核模板的使用,需要注意的是,该滤波函数是单通道运算的,也就是说对于彩色图像的滤波,需要将彩色图像的各个通道提取出来,对各个通道分别滤波才行。

一次微分

dst = cv2.filter2D(src, -1, kernel)

高斯滤波

「NumPy」「cv2.filter2D」「cv2.GaussianBlur」 dst = cv2.filter2D(src, -1, kernel) dst = cv2.GaussianBlur(src, ksize, sigmaX)

平均値フィルタ(Averaging Filter)

「cv2.filter2D」や「cv2.Blur」

k平均法で減色処理

cv2.kmeans

ヒストグラム平均化

cv2.equalizeHist OR NumPyで実装

画像の圧縮(画質は80%)

cv2.imencode, cv2.imdecode result, encimg = cv2.imencode("img2.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 80])

グレースケール変換

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

HSV 変換

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

ヒストグラムの作成

方法①・・・NumPyの「numpy.histogram」を使用 hist, bins = np.histogram(src.ravel(),256,[0,256]) 方法②・・・OpenCVの「cv2.calcHist」を使用

マスク設定(hsv空間の例)

mask = cv2.inRange(hsv, hsv_min, hsv_max)

マスク処理

cv2.bitwize_and(img_src, img_src2(img_srcと同じものでいい), mask=img_mask(マスク画像をinreadしておく))

動画ファイルの読み込み

cv2.VideoCapture

Image読む、表示、書き出す

cv2.imread(), cv2.imshow() , cv2.imwrite()

Add text

cv2.putText(src, 'HelloWorld', (150,50), cv2.FONT_HERSHEY_PLAIN, 5, (255, 0,0), 5, cv2.LINE_AA)

Draw rectangle

cv2.rectangle(img, (pt[0], pt[1] ), (pt[0] + w, pt[1] + h), (0,0,200), 3)

rainit2006 commented 5 years ago

Affine Transform

アフィン変換とは、平行移動と線形変換を組み合わせた変換です。 つまり、アフィン変換で画像の拡大・縮小、回転、移動などを行うことができます。

補間法

最近傍法(Nearest neighbor): 画像を拡大した際に最近傍にある画素をそのまま使う線形補間法です。

バイリニア補間法(Bi-linear interpolation)は、周囲の4つの画素を用いた補間法です。 最近傍法よりも計算処理は重いですが、画質の劣化を抑えることが出来ます。

バイキュービック補間法(Bicubic interpolation):バイキュービック補間法では、周囲16画素の画素値を利用します。そして、距離に応じて関数を使い分け、加重平均を求めます。

二値化処理

ある閾値で画像を二値画像に変換する処理。 適応的二値化処理では、閾値を固定せず、注目画素と周囲にある画素の画素値の平均値を閾値とします。 大津の手法(判別分析法)は、分離度が最も大きくなるときの閾値を求めます。

Laplace LOG DOG

Laplace算子: Laplace算子是一种各向同性算子,二阶微分算子,具有旋转不变性。在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。 https://www.cnblogs.com/wj-1314/p/9800272.html Laplace算子对噪声很敏感,所有要进行高斯滤波然后再laplace。 因为LOG滤波器有无限长的拖尾,若取得很大尺寸,将使得计算不堪重负。LOG滤波器可以近似为两个指数函数之差,即DOG ( Difference Of Gaussians)。

DoG(Difference of Gaussian) sigmaの値が異なる2つのガウシアンフィルタ画像の差分です。 この差分画像(DoG画像)を作成するフィルタをDoGフィルタといいます。 是灰度图像增强和角点检测的方法。

DoM(Difference of Median)とは、 カーネルサイズが異なる2つのメディアンフィルタ画像の差分です。DoMフィルタは、積分画像を使って処理を高速化できます。そのため、DoGの代わりに用いられます。

積分画像(Integral Image)

注目画素とその左と上にある全ての画素値の和を求めた物です。

積分画像は近傍画素の処理の高速化によく使われます。 例えば、注目画素と8近傍の計9画素の画素値の総和を求めたいとします。 普通に計算すると、「画素値の取り出し9回」と「加算8回」を行う必要があります。 ところが、あらかじめ積分画像を作っておけば、「画素値の取り出し4回」と「加算1回+減算2回」で済ませることができます。 ## 一次微分フィルタ https://algorithm.joho.info/image-processing/differential-filter/ 一次微分フィルタは、画像から輪郭を抽出する空間フィルタです。 一次微分を計算することで、注目画素の左右・上下の画素値の変化の傾きが求まります。 画像の輪郭は画素値の変化が大きいため、微分した画素値が大きい箇所が輪郭となります。 ## mean滤波 ## 高斯滤波 考え方は簡単で、ガウス分布を利用して「注目画素からの距離に応じて近傍の画素値に重みをかける」という処理を行い、自然な平滑化を実現します。 ![image](https://user-images.githubusercontent.com/12871721/64470607-0700f380-d181-11e9-82b9-5df237fa9137.png) ## 平均値フィルタ(Averaging Filter) https://algorithm.joho.info/image-processing/average-filter-smooth/ 平均値フィルタは、注目画素の近傍の画素値の平均値を計算し、その値を新しい画素値とする 画像を平滑化(ぼかし)してノイズを除去する空間フィルタとして使用されます。 平滑化フィルタのカーネルKは次のようになります。 ## K-means https://algorithm.joho.info/mathematics/k-means-clustering/ k-means法はクラスター分析手法の1つです。 画像処理では、色数を減らすのに利用されます。 例えばクラスタ数N=10でk平均法を実行すれば、画像の色数は10個になります。(10値化) ## トーンカーブ(線形濃度変換)の原理・計算式 https://algorithm.joho.info/image-processing/tone-curve/ ## ガンマ補正の原理・計算式 https://algorithm.joho.info/image-processing/gamma-correction/ ## 画像のヒストグラム平均化 https://algorithm.joho.info/image-processing/histogram-equalization/ ![image](https://user-images.githubusercontent.com/12871721/64468777-8253ac80-d163-11e9-9110-c71c209cb3e2.png)
rainit2006 commented 5 years ago

テンプレートマッチング(Template matching)

入力画像中からテンプレート画像(部分画像)と最も類似する箇所を探索する処理です。 代表例:「SSD」「SAD」「NCC」

SSD(Sum of Absolute Difference)

「画素値の差分の二乗値の和」で類似度を評価します。 image

SSDが最小となる走査位置が、テンプレート画像に最も類似する部分の左上座標となります。

SAD(Sum of Absolute Difference)

「画素値の差分の絶対値の和」で類似度を評価します。 image SADの特徴(和SSD相比) 1.計算量が少ない(メリット) 2.外れ値の影響を受けにくい(メリット) 3.照明の影響をかなり受けやすい(デメリット)

NCC(Normalized Cross Correlation)

「正規化相互相関」で類似度を評価します。 image NCCの値は-1.0~1.0に収まり、最大値1.0に最も近くなった走査位置が、テンプレート画像に最も類似する部分の左上座標となります。

NCCの特徴 1 | 照明の影響を受けにくい(メリット) 2 | 計算量が多い(デメリット)

ZNCC(Zero means Normalized Cross Correlation)

「零平均正規化相互相関」と呼ばれる統計量で類似度を評価します。 image

ZNCCの特徴 1 | 照明変化に対するロバスト性が高い(計算過程で平均値を引くため、比較する2つの画像領域の平均値が異なっていても類似度が変化しません。つまり、NCCよりも明るさの変動に対してよりロバストとなります。)

rainit2006 commented 5 years ago

Haar Cascade

物体検出に使われる識別器の1つ。 image カスケード型識別器(Cascade detector)は、検出精度の異なる複数の強識別器を連結した識別器です。各強識別器で入力画像が顔画像であるかどうか順番に判別していきます。 探索窓画像を入力し、強識別器1~Nの全てで正解(顔)と判別された場合のみ顔画像であると判別します。 逆に途中で非正解(非顔)と判別されたら非顔画像と結論付けて処理を終えます。 このように、途中で非顔画像を弾いて処理を終了することで全体的な処理を高速化しています。

Haar Cascadesの作成手順は以下の通りです。 1 | N個の識別器それぞれに対して目標値(最小検出率dと最大許容誤検出率f)を設定します。 2 | 訓練データ(顔・非顔画像、教師データ)を多数用意します。 3 | N個の強識別器をAdaBoost学習で順に作成します。 3.1 | i番目の強識別器に弱識別器(Haar-like特徴)を1つ追加します (最初はi=1) 3.2 | 強識別器に訓練データを与えて、判別を行わせます。 3.3 | 判別結果が目標値を満たすよう、強識別器の閾値を下げます。(※誤検出率は高くなる) 3.4 | 誤検出率が目標値を満たせばAdaBoost学習を終了し、手順3.5に進みます。満たさなければ手順3.1に戻って学習を続けます。 3.5 | 判別を誤った非顔画像のみを、次の強識別器を求めるのに使用する非顔画像とします。 3.6 | 手順3.1に戻り、次の強識別器を作成します。(i=i+1) 手前にある強識別器に対しては最大許容誤検出率fを高めに設定します。

Haar-like特徴の原理・・・顔を判別するための特徴(弱識別器) AdaBoost学習の原理・・・多数の弱識別器(Haar-like特徴)から強識別器を作成 カスケード型識別器・・・非顔領域の判別時間を短縮(処理の高速化)

Haar-Like特徴量の原理・計算式・高速化

https://algorithm.joho.info/image-processing/haar-like-feature-value/ ①Haar-like特徴に用いるパターンを複数用意します。 image ②入力画像の任意の位置に探索窓を配置します。 ③探索窓の任意の位置に矩形領域を配置します。 ④矩形領域に任意のパターンを設定します。 ⑤パターンの黒領域、白領域それぞれの画素値の和の平均A_1, A_2を求めます。 そして、それらの差を特徴量Hとします。 ⑥矩形領域の位置・サイズ・パターンを変えて⑤の計算を繰り返します。 ⑦検索窓の位置を変えて②~⑥を繰り返します。

検出時間の高速化: 学習によって決定した重要度が高い特徴量のみを使うことで、計算時間を短縮します。 これをブースティング(Boosting)といいます。

【機械学習】ブースト(boost・AdaBoost)の原理・計算式

https://algorithm.joho.info/machine-learning/boost-adaboost/ ブースト(boost)とは、多くの弱識別器を組み合わせて強識別器を作成することです。 識別器を強化することから「ブースト」と呼ばれます。

AdaBoostでは、学習過程で弱識別器に対して適応的に重み付けを行います。 そして、重みが大きい弱識別器を重点的に組み合わせて識別器の能力を高めていきます。

【特徴】 ・計算時間が短い(処理が高速) ・事前のチューニングが不要 ・ノイズや外れ値の影響を受けやすい

カスケード型識別器(分類器)の原理・計算式

カスケード型識別器(Cascade detector)は、複数の強識別器を連結した識別器です。 image

rainit2006 commented 5 years ago

ONNX(Open Neural Network eXchange:オニキス)とは、様々な機械学習フレームワークの間で、ディープラーニングの学習モデルを効率的にやり取りするための共通フォーマットです。 例えばKerasで作成した学習済みモデルをONNX形式で保存すれば、OpenCVなど他のフレームワークでもそのまま利用できます。

OpenCVではバージョン4から「cv2.dnn.readNetFromONNX()」でONNXをロードできるようになりました。

rainit2006 commented 5 years ago

动态跟踪

https://zhuanlan.zhihu.com/p/68571164

角点检测

Harris

Shi-Tomas角点检测

对Harris角点检测算法改进后的新算法。

亚像素级的角点检测

OpenCV中角点检测的结果实际不够精准,因为真实的计算中有些位置可能是在浮点数的空间内才最大值,这样就需要我们通过给定的响应值,在像素邻域空间进行拟合,实现亚像素级别的角点检测。

SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT)

https://blog.csdn.net/qq_29893385/article/details/84388259 简单的SIFT的理解是最后检测出来的特征点匹配适用于所有尺寸的图像。 SIFT算法利用DoG(差分高斯)来提取关键点(或者说成特征点),DoG的思想是用不同的尺度空间因子(高斯正态分布的标准差σσ)对图像进行平滑,然后比较平滑后图像的区别,差别大的像素就是特征明显的点,即可能是特征点。对得到的所有特征点,我们剔除一些不好的,SIFT算子会把剩下的每个特征点用一个128维的特征向量进行描述。 一幅图像经过SIFT算法后可以表示为一个128维的特征向量集。

DoG:Different of Gaussians。 DoG是对同一图象使用不同高斯滤波器作差所得到的结果。DoG操作的最终结果会得到感兴趣的区域(关键点),这将通过SIFT来进行特征描述。

其实,通常用LoG(Laplacian of Gaussian)函数通过调节参数 [公式] 来调节图像缩放的尺寸,在不同缩放尺寸下求得局部极大值,并形成参数 [公式] ,这些参数的集合就是潜在的关键点。但LoG对系统开销较大,因此用DoG(Difference of Gaussian)函数代替LoG函数。

光流

https://zhuanlan.zhihu.com/p/69999853 https://zhuanlan.zhihu.com/p/74460341 光流是由对象或相机的移动引起的两个连续帧之间的图像对象的明显运动的模式.它是2D矢量场,其中每个矢量是位移矢量,表示从第一帧到第二帧的点的移动。 光流有很多应用场景如下:

LK或KLT算法,Lucas-Kanada 方法

稀疏光流算法。 KLT算法工作有三个假设前提条件( three assumptions):

金字塔Lucas-Kanade方法

https://blog.csdn.net/sgfmby1994/article/details/68489944 LK算法假设条件2是短距离移动,但是对于快速运动的时候,需要使用金字塔LK方法。 思路: 利用金字塔分层方法缩小图像,让LK算法可以继续适用。

# Meanshift https://zhuanlan.zhihu.com/p/71840019 ## Mean Shift均值漂移算法 是无参密度估计理论的一种,无参密度估计不需要事先知道对象的任何先验知识,完全依靠训练数据进行估计,并且可以用于任意形状的密度估计,在某一连续点处的密度函数值可由该点邻域中的若干样本点估计得出。 思想:沿着点的密度最大的区域移动。 ![image](https://user-images.githubusercontent.com/12871721/64919050-57133200-d7e1-11e9-8a6f-d4b75f9d367c.png) mean-shift用来计算窗口的重心,当窗口移动时需要重新计算出窗口的重心。所以mean-shift可以用于物体跟踪。 ## Camshift cam-shift又是在mean-shift基础上的升华。 在mean-shift算法中,如何选择窗口大小,是一个问题,窗口选的太大,太小都不好。 尤其是在一个视频序列中,如果你需要跟踪的目标物迎面走来或者背驰而去,那么目标物的尺度大小都会发生显著的变化。 cam-shift是作用在视频序列上面的,它先用mean-shift算法找到物体中心点,再通过计算物体的二阶矩来加上一些先验知识来产生迭代公式。 ## 卡尔曼滤波 https://zhuanlan.zhihu.com/p/25598462 卡尔曼滤波适用于估计一个动态系统的最优状态。即便是观测到的系统状态参数含有噪声,观测值不准确,卡尔曼滤波也能够完成对状态真实值的最优估计。 卡尔曼滤波的工作原理主要包括先验估计和后验估计。 整个卡尔曼滤波的过程就是个递推计算的过程,不断的“预测——更新——预测——更新……”。 Three important assumptions: (1)the system being modeled is linear, (2) the noise that measurements are subject to is “white”, and (3) this noise is also Gaussian in nature. https://blog.csdn.net/xieyan0811/article/details/72528420 ## Condensation算法 Kalman滤波是基于单假设的建模,是单高斯。不能适用于多高斯模型。
rainit2006 commented 5 years ago

DNN库

CV3.3 バージョンからDNN(deep neural network: 多層ニューラルネットワーク)モジュールが追加され、学習済みデータを利用した物体認識ができるようになりました。

常用函数

在dnn中从磁盘加载图片:

cv2.dnn.blobFromImage cv2.dnn.blobFromImages 用“create”方法直接从各种框架中导出模型:

cv2.dnn.createCaffeImporter cv2.dnn.createTensorFlowImporter cv2.dnn.createTorchImporter 使用“读取”方法从磁盘直接加载序列化模型:

cv2.dnn.readNetFromCaffe cv2.dnn.readNetFromTensorFlow cv2.dnn.readNetFromTorch cv2.dnn.readhTorchBlob 从磁盘加载完模型之后,可以用.forward方法来向前传播我们的图像,获取分类结果。

参考网页

https://zhuanlan.zhihu.com/p/28323601

加载模型

若为caffe模型,则使用readNetFromCaffe,需要用到.prototxt格式的配置文件和.caffemodel格式的模型文件。 若为tensorflow模型,则使用readNetFromTensorflow,需要用到.pbtxt格式的配置文件和.pb格式的模型文件。

电脑里不需要安装tensorflow和GPU,就直接拿来模型用。

About Tensorflow’s .pb and .pbtxt files

Tensorflow models usually have a fairly high number of parameters. Freezing is the process to identify and save just the required ones (graph, weights, etc) into a single file that you can use later. So, in other words, it’s the TF way to “export” your model. The freezing process produces a Protobuf ( .pb ) file. Additionally, OpenCV requires an extra configuration file based on the .pb, the .pbtxt.

If you want to use pre-trained models, the amazing OpenCV community already did the hard work for the following models. image

TFモジュールについて

https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API

sample code

# How to load a Tensorflow model using OpenCV
# Jean Vitor de Paulo Blog - https://jeanvitor.com/tensorflow-object-detecion-opencv/

import cv2

# Load a model imported from Tensorflow
tensorflowNet = cv2.dnn.readNetFromTensorflow('frozen_inference_graph.pb', 'graph.pbtxt')

# Input image
img = cv2.imread('img.jpg')
rows, cols, channels = img.shape

# Use the given image as input, which needs to be blob(s).
tensorflowNet.setInput(cv2.dnn.blobFromImage(img, size=(300, 300), swapRB=True, crop=False))

# Runs a forward pass to compute the net output
networkOutput = tensorflowNet.forward()

# Loop on the outputs
for detection in networkOutput[0,0]:

    score = float(detection[2])
    if score > 0.2:

        left = detection[3] * cols
        top = detection[4] * rows
        right = detection[5] * cols
        bottom = detection[6] * rows

        #draw a red rectangle around detected objects
        cv2.rectangle(img, (int(left), int(top)), (int(right), int(bottom)), (0, 0, 255), thickness=2)

# Show the image with a rectagle surrounding the detected objects 
cv2.imshow('Image', img)
cv2.waitKey()
cv2.destroyAllWindows()

Result: image

rainit2006 commented 5 years ago

形态学处理

https://zhuanlan.zhihu.com/p/33908821

啥是形态学处理

形态学处理又可理解为形态学变换(Morphological Transformations),是一种基于形状的简单变换(形象的解释:形态学变换来源于形状,但高于形状)。它的处理对象通常是二值化图像(也常用于彩色图像)。 膨胀与腐蚀是最基本的两种形态学变换方法。 膨胀和腐蚀是针对较亮的像素的两种相反的操作,即较亮的像素会膨胀和被腐蚀(被暗色腐蚀)。

膨胀(Dilation)

原图与核进行卷积,将最大值赋予指定像素,从而使亮者更亮,效果就是亮的区域膨胀了。 image image 可以理解为,将结构B(核)在结构A上进行卷积操作,所有移动结构B与结构A存在交集的位置的集合为结构A在结构B作用下的膨胀结果。

dst=cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

src:源图,通道数任意,深度需为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F
dst:输出图,与src有着同样的尺寸
kernel:膨胀操作的核,通常这个参数由函数getStructuringElement得到(稍后会讲)
anchor:锚点位置,默认值为中心点
iterations:自身迭代的次数,默认为1
borderType和borderValue都有各自的默认值,通常不用理会

腐蚀(Erosion)

操作与膨胀相反,求局部最小值。 image image 可以理解为,移动结构B(核),如果结构B与结构A的交集完全属于结构A的区域内,则保存该位置点,所有满足条件的点构成结构A被结构B腐蚀的结果。

dst=cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

kernel:腐蚀操作的核,通常这个参数由函数getStructuringElement得到(稍后会讲)
iterations:自身迭代的次数,默认值为1

关于getStructuringElement函数

用于计算kernel。

retval=cv2.getStructuringElement(shape, ksize[, anchor])
retval:得到的核,矩阵形式
shape:核的形状,有cv2.MORPH_RECT、cv2.MORPH_CROSS和cv2.MORPH_ELLIPSE
ksize:核的大小, [公式] 形式
anchor:锚点,默认为中心

开运算和闭运算,形态学梯度

开运算:先腐蚀后膨胀,用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。 闭运算: 先膨胀后腐蚀,闭运算能够排除小的黑色区域。 形态学梯度: 膨胀图与腐蚀图之差,通常用来保留边缘轮廓(不是轮廓和边缘识别)。 上述三种常规操作是通过调用函数morphologyEx并修改对应的参数来实现的。

dst=cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) src:源图,深度需为CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F op:操作标识符,即进行哪种操作。 image kernel:核,依然由getStructuringElement求得

rainit2006 commented 5 years ago

图像合成与图像融合

https://zhuanlan.zhihu.com/p/58722618 image

1. 直接剪切粘贴技术(cut-and-paste)

从图像中确定前景和背景的技术叫做抠图,英文对应:Image Matting. 将抠出的部分无缝的贴入目标图像的过程则称为图像合成,英文对应:Image Compositing.

2. Alpha融合

Alpha融合是一个升级版的cut-and-paste. 公式: output = foreground mask + background (1-mask)

由于上面使用的Mask是二值的,因此融合的图像很不自然. 如果对Mask图做稍稍的羽化(feathering),效果就会好很多. 因此Alpha融合的效果好坏取决我们如何正确的设置Alpha Mask,如果要把一张图中的一部分抠出,并融合到另外一张新的图片中,主要牵涉到两个步骤: 1, 准确的抠图获取Alpha Mask 2, 对Alpha Mask做合适的羽化,使得融合更自然 ## 3. 多频段融合 ![image](https://user-images.githubusercontent.com/12871721/65829837-84350980-e2e4-11e9-9092-64e3bc8cd903.png) 流程: 1. 对要融合的两张照片,构建拉普拉斯金字塔 2. 对金字塔的每一层,应用以下公式进行融合 ![image](https://user-images.githubusercontent.com/12871721/65829857-bba3b600-e2e4-11e9-91d2-3c0e5a7e0506.png) 3. 利用融合后的金字塔重建出输出图像 ## 4. 泊松融合 https://zhuanlan.zhihu.com/p/58867397