是否有一種算法可以將一個圖像作爲輸入並將圖像列表作爲第二個輸入並告訴哪一個圖像最相似?在我們的問題中,我們可以讓圖像由於水印而變得相同。因此,即使水印不同,我們也需要識別匹配的圖像。找到一組中最相似的圖像的圖像比較算法
這是神經網絡嗎?有沒有特定的算法?
是否有一種算法可以將一個圖像作爲輸入並將圖像列表作爲第二個輸入並告訴哪一個圖像最相似?在我們的問題中,我們可以讓圖像由於水印而變得相同。因此,即使水印不同,我們也需要識別匹配的圖像。找到一組中最相似的圖像的圖像比較算法
這是神經網絡嗎?有沒有特定的算法?
關鍵點提取和匹配是這個問題的解決方案之一。 使用一些特徵檢測器作爲SIFT,SURF,快速跟蹤...來提取原始圖像和其他圖像上的關鍵點。在這些日子裏,SIFT檢測器因其準確性和效率而變得普遍並得到很大改進。
之後,特徵是由RANSAC算法或其他匹配...
的匹配圖像可以通過許多真實的匹配點來定義。
可以參考關鍵點算法的OpenCV: API:http://docs.opencv.org/2.4/modules/refman.html 示例:http://docs.opencv.org/2.4/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.html#table-of-content-feature2d
一種可能的方法是感知散列,這是相當堅固的,並且可以進行調整。 Survey paper link
當然,這也可以通過深度學習來完成,但這需要更多的工作。 Slides
定義問題設置總是需要的。是否有像素相等的結果(即使經典的像素工作哈希);是否有不同的壓縮(需要魯棒性);是否存在顏色轉換或甚至幾何轉換(如旋轉); size-changings ... 經典的感知哈希算法是相當強大的,即使是適度的轉換。
前段時間我implemented一個簡單的感知幀散列(基於像素統計,而不是功能)的例子。我會在「更深入」(CNN)之前嘗試這樣的事情:-)
還有一個查詢過程的問題。雖然我不記得我的方法的散列屬性(也許是誤差的度量標準就足夠了),但幻燈片中的深度學習嘗試保持相似性,以便在查詢時可以獲得距離/排名。
最簡單的方法是註冊(對齊)(對於Matlab和OpenCV都有ECC註冊),您可以設計自己的方法來創建一個方案。
更好的方法是使用Matlab中的MSER或FAST特徵。使用他們的文檔,他們從字面上做你所要求的。
PS:在Matlab 2015b中內置了一個梯級教練,它正是您所要求的。採取參考圖像,要求背景W/O參考圖像和WALLA你有自己的級聯分類器準備好,在閒暇時使用它分類圖像的左側,右側,側面和底部,兒子。
如果你想解決水印攻擊,我會推薦你圖像哈希算法,它們對這種攻擊是快速和強大的。讓我告訴你一些例子
#include <opencv2/core.hpp>
#include <opencv2/core/ocl.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/img_hash.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
void watermark_attack(cv::Ptr<cv::img_hash::ImgHashBase> algo)
{
std::vector<std::string> const origin_img
{
"origin_00.png", "origin_01.png",
"origin_02.png", "origin_03.png"
};
std::vector<std::string> const watermark_img
{
"watermark_00.png", "watermark_01.png",
"watermark_02.png", "watermark_03.png"
};
cv::Mat origin_hash, watermark_hash;
for(size_t i = 0; i != origin_img.size(); ++i){
cv::Mat const input = cv::imread(origin_img[i]);
cv::Mat const watermark_input = cv::imread(watermark_img[i]);
//compute the hash value of image without watermark
algo->compute(input, origin_hash);
//compute the hash value of image with watermark
algo->compute(watermark_input, watermark_hash);
//compare the different between the hash values
//of original image and watermark image
std::cout<<algo->compare(origin_hash, watermark_hash)
<<std::endl;
}
}
int main()
{
using namespace cv::img_hash;
//disable opencl acceleration may(or may not) boost up speed of img_hash
cv::ocl::setUseOpenCL(false);
watermark_attack(AverageHash::create());
}
的結果是1,2,1,2,全部通過。
這個小程序比較原始圖像(左)與他們的水印兄弟(右),計算節目的值越小,圖像越相似。對於AverageHash的情況,推薦閾值爲5(即如果比較結果大於5,圖像被認爲是非常不同的)。
不僅水印,AverageHash提供了另一個「副作用」,該算法在對比度下工作,噪聲(高斯,胡椒和鹽),調整大小和jpeg壓縮攻擊。
使用圖像哈希的另一個好處是您可以將圖像的哈希值存儲在文件中,您不需要一次又一次計算哈希值。
Simple and fast method to compare images for similarity將向您顯示有關opencv的img_hash模塊的更多詳細信息。