C++實現圖像目標區裁剪ImageCropping
場景需求
在做圖像處理時,有時候會需要適當地進行一些裁剪工作,比如我做幹涉測量領域,我們所要處理的圖像區域是條紋所在區域,而原圖又遠大於我所想分析的目標區,此時就需要對圖像進行裁剪,這樣做的好處:
1)縮減計算量,提高程序運行速度;
2)裁剪後的圖像尺寸正好是歸一化的圖像尺寸,如果有歸一化的需求,可以直接用裁剪圖像尺寸建立歸一化數據網格圖。
我就是為瞭計算柱面的擬合系數才寫瞭這個函數,若要得到同光學領域標準一致的系數,需要先歸一化數據,而歸一化的范圍就正好是裁剪的圖像大小。
函數通俗易懂,就是用掩膜鎖定目標區,再分析掩膜在原圖中的上下左右邊界,用roi提取出來即可。
話不多說,下方為具體實現函數和測試代碼。
功能函數代碼
/** * @brief ImageCropping 圖像裁剪 * @param phase 所需裁剪的圖像 * @return 裁剪後圖像 */ cv::Mat ImageCropping(const cv::Mat &phase) { // 非測量區一般都進行瞭NaN處理,所以掩膜繪制隻需要判斷是否為NaN值即可 cv::Mat mask = cv::Mat::zeros(phase.size(), CV_8UC1); mask.setTo(255, phase == phase); int roi_up = 10000; int roi_down = 0; int roi_left = 10000; int roi_right = 0; int row = phase.rows; int col = phase.cols; for (int i = 0; i < row; i++) { uchar *m = mask.ptr<uchar>(i); for (int j = 0; j < col; j++) { if (m[j] != 0) { if (j < roi_left)roi_left = j; if (j > roi_right)roi_right = j; if (i < roi_up)roi_up = i; if (i > roi_down)roi_down = i; } } } int w = roi_right - roi_left; int h = roi_down - roi_up; // 一般提取奇數尺寸,方便計算 if (w % 2 == 0)w++; if (h % 2 == 0)h++; cv::Mat crop_phase = phase(cv::Rect(roi_left, roi_up, w, h)).clone(); return crop_phase; }
C++測試代碼
#include<iostream> #include<opencv2/opencv.hpp> #include<ctime> using namespace std; using namespace cv; cv::Mat ImageCropping(const cv::Mat &phase); int main(void) { cv::Mat phase(100, 100, CV_32FC1, nan("")); cv::circle(phase, cv::Point(50, 50), 30, 255, -1); cv::Mat crop = ImageCropping(phase); imshow("original", phase); imshow("result", crop); waitKey(0); system("pause"); return 0; } /** * @brief ImageCropping 圖像裁剪 * @param phase 所需裁剪的圖像 * @return 裁剪後圖像 */ cv::Mat ImageCropping(const cv::Mat &phase) { // 非測量區一般都進行瞭NaN處理,所以掩膜繪制隻需要判斷是否為NaN值即可 cv::Mat mask = cv::Mat::zeros(phase.size(), CV_8UC1); mask.setTo(255, phase == phase); int roi_up = 10000; int roi_down = 0; int roi_left = 10000; int roi_right = 0; int row = phase.rows; int col = phase.cols; for (int i = 0; i < row; i++) { uchar *m = mask.ptr<uchar>(i); for (int j = 0; j < col; j++) { if (m[j] != 0) { if (j < roi_left)roi_left = j; if (j > roi_right)roi_right = j; if (i < roi_up)roi_up = i; if (i > roi_down)roi_down = i; } } } int w = roi_right - roi_left; int h = roi_down - roi_up; // 一般提取奇數尺寸,方便計算 if (w % 2 == 0)w++; if (h % 2 == 0)h++; cv::Mat crop_phase = phase(cv::Rect(roi_left, roi_up, w, h)).clone(); return crop_phase; }
測試效果
圖1 裁剪前後對比圖
在測試案例中,隨機生成瞭一個100*100的數據矩陣,中間一個30半徑的圓,也是我需要的目標區域,運用ImageCropping函數實現瞭目標區域的提取。
到此這篇關於C++實現圖像目標區裁剪ImageCropping的文章就介紹到這瞭,更多相關C++目標裁剪ImageCropping內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++基於灰度圖上色GrayToColorFromOther的實現
- 基於OpenCV自定義色條實現灰度圖上色功能代碼
- C++ Opencv自寫函數實現膨脹腐蝕處理技巧
- OpenCV實現背景分離(證件照背景替換)
- C++ opencv圖像處理實現灰度變換示例