目錄
創(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--參考
? 通過(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 APIdouble 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 APIvoid 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)查看詳情吧