圖像類似度比較和檢測圖像中的特定物

對普通人而言,識別任意兩張圖片是否類似是件很容易的事兒。可是從計算機的角度來識別的話,須要先識別出圖像的特徵,而後才能進行比對。在圖像識別中,顏色特徵是最爲常見的。每張圖像均可以轉化成顏色分佈直方圖,若是兩張圖片的直方圖很接近,就能夠認爲它們很類似。這有點相似於判斷文本的類似程度。java

圖像比較

先來比對兩張圖片,一張是原圖另外一張是通過直方圖均衡化以後的圖片。
git

原圖和直方圖均衡化比較.png

兩者的相關性因子是-0.056,這說明兩張圖的類似度很低。在上一篇文章 圖像直方圖與直方圖均衡化 中,已經解釋過什麼是直方圖均衡化。經過直方圖均衡化後,兩張圖片確實是不一樣的,能夠從下圖看出。github

直方圖均值化.png

咱們來看看如何使用直方圖比較。算法

final Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.test_hist);
        image0.setImageBitmap(bitmap);

        CV4JImage cv4jImage = new CV4JImage(bitmap);
        ImageProcessor imageProcessor = cv4jImage.convert2Gray().getProcessor();

        int[][] source = null;
        int[][] target = null;

        CalcHistogram calcHistogram = new CalcHistogram();
        int bins = 180;
        source = new int[imageProcessor.getChannels()][bins];
        calcHistogram.calcHSVHist(imageProcessor,bins,source,true);

        if (imageProcessor instanceof ByteProcessor) {
            EqualHist equalHist = new EqualHist();
            equalHist.equalize((ByteProcessor) imageProcessor);
            image1.setImageBitmap(cv4jImage.getProcessor().getImage().toBitmap());

            target = new int[imageProcessor.getChannels()][bins];
            calcHistogram.calcHSVHist(imageProcessor,bins,target,true);
        }

        CompareHist compareHist = new CompareHist();
        StringBuilder sb = new StringBuilder();
        sb.append("巴氏距離:").append(compareHist.bhattacharyya(source[0],target[0])).append("\r\n")
                .append("協方差:").append(compareHist.covariance(source[0],target[0])).append("\r\n")
                .append("相關性因子:").append(compareHist.ncc(source[0],target[0]));

        result.setText(sb.toString());複製代碼

其中,CompareHist 這個類是用於直方圖比較的類。app

而後,再來比較兩張徹底一致的圖片,能夠看到他們的相關性因子是1.0,表示二者徹底一致。
ui

兩張相同的圖比較.png

最後,來比對兩張徹底不一樣的圖片,能夠看到它們的相關性因子是0.037,表面兩者幾乎沒有什麼類似之處。
spa

兩張徹底不一樣的圖比較.png

直方圖比較是識別圖像類似度的算法之一,也是最簡單的算法。固然,還有不少其餘的算法啦。.net

直方圖反向投影

所謂反向投影就是首先計算某一特徵的直方圖模型,而後使用模型去尋找圖像中存在的該特徵。
3d

反向投影的算法.png

其中,b(xi)表示在位置xi上像素對應的直方圖第b(xi)個bin,直方圖共m個bin,qu表示第u個bin的值。

下圖是皇馬的拉莫斯在2017年歐冠決賽時的圖片。直方圖反向投影能夠根據球員球衣中的某一塊區域,來查找圖片中拉莫斯所穿的球衣。code

直方圖反向投影.png

上圖是否是很酷炫?來看看是怎樣使用反向投影的,須要先計算出樣本的直方圖,而後使用模型去尋找原圖中存在的該特徵。反向投影的結果包含了:以每一個輸入圖像像素點爲起點的直方圖對比結果。在這裏是一個單通道的浮點型圖像。

Resources res = getResources();
        Bitmap bitmap1 = BitmapFactory.decodeResource(res, R.drawable.test_project_target);
        targetImage.setImageBitmap(bitmap1);

        Bitmap bitmap2 = BitmapFactory.decodeResource(res, R.drawable.test_project_sample);
        sampleImage.setImageBitmap(bitmap2);

        CV4JImage cv4jImage = new CV4JImage(bitmap1);
        ColorProcessor colorProcessor = (ColorProcessor)cv4jImage.getProcessor();

        BackProjectHist backProjectHist = new BackProjectHist();

        int w = colorProcessor.getWidth();
        int h = colorProcessor.getHeight();

        CV4JImage resultCV4JImage = new CV4JImage(w,h);
        ByteProcessor byteProcessor = (ByteProcessor)resultCV4JImage.getProcessor();

         // sample
        CV4JImage sample = new CV4JImage(bitmap2);
        ColorProcessor sampleProcessor = (ColorProcessor)sample.getProcessor();
        CalcHistogram calcHistogram = new CalcHistogram();
        int bins = 32;
        int[][] hist = new int[sampleProcessor.getChannels()][bins];
        calcHistogram.calcHSVHist(sampleProcessor,bins,hist,true);

        byte[][] source = new byte[][]{colorProcessor.getRed(),colorProcessor.getGreen(),colorProcessor.getBlue()};
        byte[][] target = new byte[3][w*h];

        Tools.rgb2hsv(source,target);
        ByteProcessor hsvByteProcessor = new ByteProcessor(target[0],w,h);
        backProjectHist.backProjection(hsvByteProcessor,byteProcessor,hist[0],new int[]{0,180});

        result.setImageBitmap(byteProcessor.getImage().toBitmap());複製代碼

其中,BackProjectHist 這個類是用於直方圖反向投影的類。

總結

直方圖比較和直方圖反向投影的算法都已經包含在cv4j中。
cv4jgloomyfish和我一塊兒開發的圖像處理庫,純java實現,目前還處於早期的版本。此次咱們填完直方圖的坑之後,終於把它發佈到jcenter上了。

單獨下載cv4j

compile 'com.cv4j:cv4j:0.1.0'複製代碼

也能夠下載rxcv4j,它是使用 RxJava2.x 進行的封裝,若是下載該模塊的話無需再下載cv4j。

compile 'com.cv4j:rxcv4j:0.1.0'複製代碼

目前已經實現的功能:

cv4j.png

下週咱們開始作模板匹配的算法。

若是您想看該系列先前的文章能夠訪問下面的文集:
www.jianshu.com/nb/10401400

相關文章
相關標籤/搜索