日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像处理之ROI区域裁剪

發布時間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像处理之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区域裁剪的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。