生活随笔
收集整理的這篇文章主要介紹了
图像处理之ROI区域裁剪
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖像ROI(region of intrest:感興趣區域)的提取往往是圖像處理中的第一步,而且也是非常關鍵的一步,ROI區域的提取能夠在消除一些噪
聲的同時減少后續圖像處理的數據量,是非常常用的方法。
在OPENCV中可以利用數據結構Rect 來提取ROI區域,具體用法示例如下:
int main()
{Mat image = imread("sources/1.bmp", 0);Rect ROI(10, 20, 300, 400);Mat img = image(ROI);imwrite("result/ROI.bmp", img);int aaa;cin >> aaa;return 0;
}
在這段程序中,原圖是image,裁剪區域是以坐標(300,500)為左上角,寬為300,高為400的一個矩形區域,如下圖:
原圖:1.bmp
裁剪結果如下:RIO.bmp
那么現在就存在一個問題,對于大多數的圖像處理項目來說,每幅圖像的ROI并不一定是在固定的區域,甚至ROI區域的大小也可能是不一樣的,
也就是說在具體裁剪的時候裁剪的位置及矩形區域都是要根據每幅圖像來具體確定的,這里將舉一個例子進行說明:如下圖是一幅啤酒蓋的圖像,
在后續的檢測或者分類中我們只關心啤酒蓋所在的區域,也就是說我們ROI區域是包含且僅包含整個啤酒蓋的一個矩形區域,如何提取呢?
我的做法,首先對原圖進行二值化,然后提取整個圖像區域內最大的連通區域,如下圖:
在得到這個最大的連通區域,其實也就是啤酒蓋所在的區域,我是通過遍歷整個圖像,找到0度,90度,180度及270度,
四個方向上連通域最靠近圖像邊緣的點,然后通過這四個點就能用一個矩形框將整個連通區域框出來,代碼如下,
采用的是幾種遍歷方法中最高效的方法:
int up = image.rows, left = image.cols, right = 0, down = 0;int flag = 0;int nr = image.rows, nc = image.cols;if (image.isContinuous()){nr = 1;nc = nc*image.rows;//convert 2D to 1D if the image is continuousflag = 1;}//cout << "flag=" << flag << endl;if (flag == 1)//situation 1:the image is continuous{for (int i = 0; i < nr; i++){const uchar* inData = region.ptr<uchar>(i);for (int j = 0; j < nc; j++){if (*inData == 0 && *(inData + 1) == 255){int row = (j + 1) / (region.cols);int col = (j + 1) - row*region.cols;if (row < up){up = row;}if (col < left){left = col;}}if (*inData == 255 && *(inData + 1) == 0){int row = j / (region.cols);int col = j - row*region.cols;if (row > down){down = row;}if (col > right){right = col;}}inData++;}}}else//situation 2:the image is not continuous{for (int i = 0; i < nr; i++){const uchar* inData = region.ptr<uchar>(i);for (int j = 0; j < nc; j++){if (*inData == 0 && *(inData + 1) == 255){int row = i;int col = j;if (row < up){up = row;}if (col < left){left = col;}}if (*inData == 255 && *(inData + 1) == 0){int row = i;int col = j;if (row > down){down = row;}if (col > right){right = col;}}inData++;}}}bb[0] = Point2i(left, up);bb[1] = Point2i(right, down);
}
其中bb[0],bb[1]是兩個坐標點,分別是確定要裁剪的矩形框的左上角與右下角在原圖中的坐標,
根據這兩個坐標點,可以利用Rect數據類型對原圖進行裁剪,如下:
Rect roi(bb[0].x,bb[0].y,bb[1].x-bb[0].x,bb[1].y-bb[0].y)最終的裁剪結果如下:
顯然通過以上辦法,實現了對于感興趣區域的裁剪。
總結
以上是生活随笔為你收集整理的图像处理之ROI区域裁剪的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。