Open rainit2006 opened 5 years ago
OpenCV 中的函数 cv2.cornerHarris() 可以用来进行角点检测,参数如下: img - 输入图像。 blockSize - 角点检测中领域像素的大小。 ksize - Sobel 求导中使用的窗口大小 k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06]. 输出 response
cascade = cv2.CascadeClassifier(path) face = cascade.detectMultiScale(src, scaleFactor, minNeighbors, minSize)
//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)
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()
cv2.integral(image)
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)
「cv2.filter2D」や「cv2.Blur」
cv2.kmeans
cv2.equalizeHist OR NumPyで実装
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 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
方法①・・・NumPyの「numpy.histogram」を使用 hist, bins = np.histogram(src.ravel(),256,[0,256]) 方法②・・・OpenCVの「cv2.calcHist」を使用
mask = cv2.inRange(hsv, hsv_min, hsv_max)
cv2.bitwize_and(img_src, img_src2(img_srcと同じものでいい), mask=img_mask(マスク画像をinreadしておく))
cv2.VideoCapture
cv2.imread(), cv2.imshow() , cv2.imwrite()
cv2.putText(src, 'HelloWorld', (150,50), cv2.FONT_HERSHEY_PLAIN, 5, (255, 0,0), 5, cv2.LINE_AA)
cv2.rectangle(img, (pt[0], pt[1] ), (pt[0] + w, pt[1] + h), (0,0,200), 3)
アフィン変換とは、平行移動と線形変換を組み合わせた変換です。 つまり、アフィン変換で画像の拡大・縮小、回転、移動などを行うことができます。
最近傍法(Nearest neighbor): 画像を拡大した際に最近傍にある画素をそのまま使う線形補間法です。
バイリニア補間法(Bi-linear interpolation)は、周囲の4つの画素を用いた補間法です。 最近傍法よりも計算処理は重いですが、画質の劣化を抑えることが出来ます。
バイキュービック補間法(Bicubic interpolation):バイキュービック補間法では、周囲16画素の画素値を利用します。そして、距離に応じて関数を使い分け、加重平均を求めます。
ある閾値で画像を二値画像に変換する処理。 適応的二値化処理では、閾値を固定せず、注目画素と周囲にある画素の画素値の平均値を閾値とします。 大津の手法(判別分析法)は、分離度が最も大きくなるときの閾値を求めます。
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の代わりに用いられます。
注目画素とその左と上にある全ての画素値の和を求めた物です。
入力画像中からテンプレート画像(部分画像)と最も類似する箇所を探索する処理です。 代表例:「SSD」「SAD」「NCC」
「画素値の差分の二乗値の和」で類似度を評価します。
SSDが最小となる走査位置が、テンプレート画像に最も類似する部分の左上座標となります。
「画素値の差分の絶対値の和」で類似度を評価します。 SADの特徴(和SSD相比) 1.計算量が少ない(メリット) 2.外れ値の影響を受けにくい(メリット) 3.照明の影響をかなり受けやすい(デメリット)
「正規化相互相関」で類似度を評価します。 NCCの値は-1.0~1.0に収まり、最大値1.0に最も近くなった走査位置が、テンプレート画像に最も類似する部分の左上座標となります。
NCCの特徴 1 | 照明の影響を受けにくい(メリット) 2 | 計算量が多い(デメリット)
「零平均正規化相互相関」と呼ばれる統計量で類似度を評価します。
ZNCCの特徴 1 | 照明変化に対するロバスト性が高い(計算過程で平均値を引くため、比較する2つの画像領域の平均値が異なっていても類似度が変化しません。つまり、NCCよりも明るさの変動に対してよりロバストとなります。)
物体検出に使われる識別器の1つ。 カスケード型識別器(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特徴)から強識別器を作成 カスケード型識別器・・・非顔領域の判別時間を短縮(処理の高速化)
https://algorithm.joho.info/image-processing/haar-like-feature-value/ ①Haar-like特徴に用いるパターンを複数用意します。 ②入力画像の任意の位置に探索窓を配置します。 ③探索窓の任意の位置に矩形領域を配置します。 ④矩形領域に任意のパターンを設定します。 ⑤パターンの黒領域、白領域それぞれの画素値の和の平均A_1, A_2を求めます。 そして、それらの差を特徴量Hとします。 ⑥矩形領域の位置・サイズ・パターンを変えて⑤の計算を繰り返します。 ⑦検索窓の位置を変えて②~⑥を繰り返します。
検出時間の高速化: 学習によって決定した重要度が高い特徴量のみを使うことで、計算時間を短縮します。 これをブースティング(Boosting)といいます。
https://algorithm.joho.info/machine-learning/boost-adaboost/ ブースト(boost)とは、多くの弱識別器を組み合わせて強識別器を作成することです。 識別器を強化することから「ブースト」と呼ばれます。
AdaBoostでは、学習過程で弱識別器に対して適応的に重み付けを行います。 そして、重みが大きい弱識別器を重点的に組み合わせて識別器の能力を高めていきます。
【特徴】 ・計算時間が短い(処理が高速) ・事前のチューニングが不要 ・ノイズや外れ値の影響を受けやすい
カスケード型識別器(Cascade detector)は、複数の強識別器を連結した識別器です。
ONNX(Open Neural Network eXchange:オニキス)とは、様々な機械学習フレームワークの間で、ディープラーニングの学習モデルを効率的にやり取りするための共通フォーマットです。 例えばKerasで作成した学習済みモデルをONNX形式で保存すれば、OpenCVなど他のフレームワークでもそのまま利用できます。
OpenCVではバージョン4から「cv2.dnn.readNetFromONNX()」でONNXをロードできるようになりました。
https://zhuanlan.zhihu.com/p/68571164
对Harris角点检测算法改进后的新算法。
OpenCV中角点检测的结果实际不够精准,因为真实的计算中有些位置可能是在浮点数的空间内才最大值,这样就需要我们通过给定的响应值,在像素邻域空间进行拟合,实现亚像素级别的角点检测。
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矢量场,其中每个矢量是位移矢量,表示从第一帧到第二帧的点的移动。 光流有很多应用场景如下:
稀疏光流算法。 KLT算法工作有三个假设前提条件( three assumptions):
https://blog.csdn.net/sgfmby1994/article/details/68489944 LK算法假设条件2是短距离移动,但是对于快速运动的时候,需要使用金字塔LK方法。 思路: 利用金字塔分层方法缩小图像,让LK算法可以继续适用。
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,就直接拿来模型用。
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.
https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API
# 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:
https://zhuanlan.zhihu.com/p/33908821
形态学处理又可理解为形态学变换(Morphological Transformations),是一种基于形状的简单变换(形象的解释:形态学变换来源于形状,但高于形状)。它的处理对象通常是二值化图像(也常用于彩色图像)。 膨胀与腐蚀是最基本的两种形态学变换方法。 膨胀和腐蚀是针对较亮的像素的两种相反的操作,即较亮的像素会膨胀和被腐蚀(被暗色腐蚀)。
原图与核进行卷积,将最大值赋予指定像素,从而使亮者更亮,效果就是亮的区域膨胀了。 可以理解为,将结构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都有各自的默认值,通常不用理会
操作与膨胀相反,求局部最小值。 可以理解为,移动结构B(核),如果结构B与结构A的交集完全属于结构A的区域内,则保存该位置点,所有满足条件的点构成结构A被结构B腐蚀的结果。
dst=cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
kernel:腐蚀操作的核,通常这个参数由函数getStructuringElement得到(稍后会讲)
iterations:自身迭代的次数,默认值为1
用于计算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:操作标识符,即进行哪种操作。 kernel:核,依然由getStructuringElement求得
https://zhuanlan.zhihu.com/p/58722618
从图像中确定前景和背景的技术叫做抠图,英文对应:Image Matting. 将抠出的部分无缝的贴入目标图像的过程则称为图像合成,英文对应:Image Compositing.
Alpha融合是一个升级版的cut-and-paste. 公式: output = foreground mask + background (1-mask)