真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Opencv(C++)筆記--直方圖比較、直方圖反向投影-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),廣安企業(yè)網(wǎng)站建設(shè),廣安品牌網(wǎng)站建設(shè),網(wǎng)站定制,廣安網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,廣安網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

1--直方圖比較

1-1--四種常見(jiàn)比較方法

1-2--OpenCV API

1-3--代碼實(shí)例

2--直方圖反向投影

2-1--Opencv API

2-2--代碼實(shí)例

2-3--代碼分析

3--參考


1--直方圖比較

? 通過(guò)比較兩幅圖像的直方圖,可以衡量?jī)煞鶊D像的相似和相關(guān)程度,一定程度上可以進(jìn)行圖像的匹配;

1-1--四種常見(jiàn)比較方法

① 相關(guān)系數(shù)(cv::HISTCMP_CORREL):數(shù)值越大,相關(guān)度越高,大值為 1,最小值為 0;

② 卡方系數(shù)(cv::HISTCMP_CHISQR):數(shù)值越小,相關(guān)度越高,大值無(wú)上界,最小值為 0;

③ 相交系數(shù)(cv::HISTCMP_INTERSECT):數(shù)值越大,相關(guān)度越高,大值為 9.455319,最小值為 0;

④ 巴氏系數(shù)(cv::HISTCMP_BHATTACHARYYA):數(shù)值越小,相關(guān)度越高,大值為 1,最小值為 0;

具體數(shù)學(xué)公式參考直方圖比較方法數(shù)學(xué)公式;

1-2--OpenCV API

double result12 = cv::compareHist(hist_src1, hist_src2, cv::HISTCMP_CORREL);
1-3--代碼實(shí)例
# include# include# includeint main(int argc, char** argv){

    cv::Mat src1, src2;

    src1 = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/test1.jpg");
    src2 = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/test1_noise.jpg");

    cv::Mat origin1, origin2;
    src1.copyTo(origin1);
    src2.copyTo(origin2);


    if (src1.empty() ||  src2.empty()){
        printf("could not load image..\n");
        return -1;
    }
    cv::imshow("input1", src1);
    cv::imshow("input2", src2);

    cv::cvtColor(src1, src1, cv::COLOR_BGR2HSV);
    cv::cvtColor(src2, src2, cv::COLOR_BGR2HSV);

    int h_bins = 50, s_bins = 60;
    int histSize[] = {h_bins, s_bins};

    float h_ranges[] = {0, 180};
    float s_ranges[] = {0, 256};
    const float* ranges[] = {h_ranges, s_ranges};
    int channels[] = {0, 1};

    cv::MatND hist_src1, hist_src2;

    cv::calcHist(&src1, 1, channels, cv::Mat(), hist_src1, 2, histSize, ranges, true, false);
    cv::normalize(hist_src1, hist_src1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

    cv::calcHist(&src2, 1, channels, cv::Mat(), hist_src2, 2, histSize, ranges, true, false);
    cv::normalize(hist_src2, hist_src2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

    double result11 = cv::compareHist(hist_src1, hist_src1, cv::HISTCMP_CORREL);
    double result12 = cv::compareHist(hist_src1, hist_src2, cv::HISTCMP_CORREL);
    
    cv::putText(origin1, std::to_string(result11), cv::Point(50, 50), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(0, 0, 255), 2, cv::LINE_AA);
    cv::putText(origin2, std::to_string(result12), cv::Point(50, 50), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(0, 0, 255), 2, cv::LINE_AA);

    cv::imshow("output1", origin1);
    cv::imshow("output2", origin2);

    cv::waitKey(0);
    return 0;
}

2--直方圖反向投影

反向投影用于反映 輸入圖像的像素點(diǎn)去適應(yīng)直方圖模型像素分布 的方式,反向投影首先計(jì)算某一特征的直方圖模型,然后使用該模型去尋找原圖像中存在的特征。反向投影在某一位置的像素?cái)?shù)值,表示原圖像對(duì)應(yīng)位置像素值在原圖像中的總數(shù)目。

反向投影將圖像特征反映到原圖像上,對(duì)于圖像中的物體特征識(shí)別和分割具有重要的作用。

2-1--Opencv API

void cv::calcBackProject(const cv::Mat *images, int nimages, const int *channels, cv::InputArray hist, cv::OutputArray backProject, const float **ranges, double scale = (1.0), bool uniform = true)

const cv::Mat *images:輸入的圖像或圖像集,需要具有相同的尺寸和深度;

int nimages:輸入圖像的數(shù)目;

const int *channels:用于計(jì)算反向投影的通道列表,具體范圍參考官方文檔;

cv::InputArray hist:輸入的直方圖數(shù)據(jù),即上面所說(shuō)的計(jì)算得到的直方圖模型;

cv::OutputArray backProject:目標(biāo)反向投影輸出圖像,是一個(gè)單通道圖像,與原圖像有相同的尺寸和深度;

const float **ranges:直方圖中每個(gè)維度bin的取值范圍(將bin理解為橫坐標(biāo),則ranges為縱坐標(biāo));

double scale = (1.0):可選輸出反向投影的比例因子;

bool uniform = true:直方圖是否均勻分布的標(biāo)識(shí)符,默認(rèn)值true;

2-2--代碼實(shí)例
# include# include# includevoid Hist_And_Backprojection(int bins, void* hue1){
    float range[] = {0, 180};
    const float *histRanges = {range}; // 直方圖數(shù)據(jù)縱坐標(biāo)的范圍
    cv::Mat h_hist; // 輸出直方圖數(shù)據(jù)

    cv::Mat hue = *(cv::Mat*)(hue1); // 這里傳入的是H色調(diào),所以計(jì)算的是色調(diào)的直方圖
    cv::calcHist(&hue, 1, 0, cv::Mat(), h_hist, 1, &bins, &histRanges, true, false); // 計(jì)算直方圖
    cv::normalize(h_hist, h_hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat()); // 歸一化到0~255

    cv::Mat backPrjImage;
    cv::calcBackProject(&hue, 1, 0, h_hist, backPrjImage, &histRanges, 1, true);
    cv::imshow("output", backPrjImage);

    // 直方圖分布圖
    int hist_h = 600;
    int hist_w = 600;
    cv::Mat histImage(hist_w, hist_h, CV_8UC3, cv::Scalar(0, 0, 0));
    int bin_w = cvRound((double)hist_w / bins);
    for (size_t i = 0; i< bins; i++){
        cv::rectangle(histImage,  cv::Point(i*bin_w, hist_h),
        cv::Point((i + 1) * bin_w,  hist_h - cvRound(h_hist.at(i)*hist_h / 255.0)), 
        cv::Scalar(0, 0, 255), 2, cv::LINE_AA);
    }
    cv::imshow("Histogram", histImage);
}

int main(int argc, char** argv){
    
    int bins = 12; // 初始值
    cv::Mat src1, hsv, hue;

    src1 = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/test1.jpg"); // 讀取圖片
    if (src1.empty()){
        printf("could not load image..\n");
        return -1;
    }
    cv::imshow("input", src1);

    cv::cvtColor(src1, hsv, cv::COLOR_BGR2HSV); // BRG ->HSV
    hue.create(hsv.size(), hsv.depth()); // HSV H表示色調(diào)、S表示飽和度、V表示明暗度
    int nchannels[] = {0, 0};
    cv::mixChannels(&hsv, 1, &hue, 1, nchannels, 1); // 將一副圖像的一個(gè)通道 復(fù)制到 另一幅圖像的另一個(gè)通道

    // 創(chuàng)建 Trackbar,回調(diào)函數(shù)為 Hist_And_Backprojection
    cv::createTrackbar("Histogram Bins: ", "input", &bins, 180, Hist_And_Backprojection, &hue); 
    Hist_And_Backprojection(bins, &hue);
        
    cv::waitKey(0);
    return 0;
}

2-3--代碼分析

① 上述代碼計(jì)算了 H(色調(diào))的直方圖,并基于?色調(diào)的直方圖特征 計(jì)算原圖像的反向投影,將色調(diào)的特征反映到原圖像中;

② 上述代碼調(diào)用cv::createTrackbar()的方式與常規(guī)方式不同,常規(guī)方式往往會(huì)使用全局變量,不傳入?yún)?shù),而上面的代碼傳入了兩個(gè)參數(shù),避免定義全局變量;

③ 上述代碼使用了一個(gè) cv::mixChannels() 函數(shù),用于將一副圖像的一個(gè)通道復(fù)制到另一幅圖像的另一個(gè)通道上;以下展示?cv::mixChannels()?的具體用法:

//void cv::mixChannels(const cv::Mat *src, size_t nsrcs, cv::Mat *dst, size_t ndsts, const int *fromTo, size_t npairs)
cv::mixChannels(&hsv, 1, &hue, 1, nchannels, 1);

const cv::Mat *src:輸入圖片或圖片集(即被復(fù)制的圖片);

size_t nsrcs:輸入圖片的數(shù)目;

cv::Mat *dst:輸出圖片或圖片集(即復(fù)制的目的圖片)

size_t ndsts:輸出圖片的數(shù)目;

const int *fromTo:復(fù)制的索引,假設(shè)輸入圖片為三通道圖像src1,其對(duì)應(yīng)的通道為 src1[0] = 0, src1[1] = 1, src1[2] = 2; 輸出圖片為兩個(gè)三通道圖像dst1和dst2,則其對(duì)應(yīng)的通道為 dst1[0] = 0, dst[1] = 1, dst1[2] = 2, dst2[0] = 3, dst2[1] = 4, dst2[2] = 5;當(dāng)需要把src1的第一個(gè)通道復(fù)制到dst1的第二個(gè)通道,src1的第一個(gè)通道復(fù)制到dst2的第三個(gè)通道,則索引對(duì)需要設(shè)置為 {0, 1, 1, 5};

size_t npairs:索引對(duì)的數(shù)量,例如上面的復(fù)制索引 {0, 1, 1, 5},其索引對(duì)數(shù)目為 2;

3--參考

C++ opencv之直方圖反向投影(calcBackProject)

opencv —— mixChannels 通道復(fù)制

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站題目:Opencv(C++)筆記--直方圖比較、直方圖反向投影-創(chuàng)新互聯(lián)
URL標(biāo)題:http://weahome.cn/article/dcphjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部