2015-10-09 56 views
1

使用OpenCV只在原始圖像的ROI部分執行一些圖像處理操作可能嗎?如何直接在原始圖像的ROI部分進行圖像處理操作?

我在網上搜索一些文章。大部分代碼是這樣的:

int main(int argc, char** argv) { 

    cv::Mat image; 

    image = cv::imread(argv[1], CV_LOAD_IMAGE_COLOR); 
    cv::Rect roi(100, 100,200, 200); 

    //do some operations on roi 

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

實際上,它創建了一個名爲ROI新的圖像,然後做一些操作在新創建的映像。我想直接在原始圖像中進行操作。例如,我想做高斯模糊,只模糊原始圖像中的部分的範圍,不要模糊此圖像的其他部分。

因爲新創建的圖像roi與原始圖像中的信息有不同的信息。 (如座標)我想保留這些信息。

在OpenCV中可以做到這一點嗎?如果是這樣,該怎麼辦?

回答

6

你可以使用一個子圖像無論是Rect或兩個Range(見OpenCV的doc)。

Mat3b img = imread("path_to_image"); 

IMG:

enter image description here

Rect r(100,100,200,200); 
Mat3b roi3b(img(r)); 

只要你不改變圖像類型,你可以在roi3b工作。所有更改都將反映在原始圖像img在:

模糊後
GaussianBlur(roi3b, roi3b, Size(), 10); 

IMG:

enter image description here

如果更改類型(例如,從CV_8UC3CV_8UC1),你需要在深工作複製,因爲Mat不能有混合類型。

Mat1b roiGray; 
cvtColor(roi3b, roiGray, COLOR_BGR2GRAY); 
threshold(roiGray, roiGray, 200, 255, THRESH_BINARY); 

您可以隨時複製原圖上的結果,同時注意糾正類型:

enter image description here

參考全碼:閾值之後

Mat3b roiGray3b; 
cvtColor(roiGray, roiGray3b, COLOR_GRAY2BGR); 
roiGray3b.copyTo(roi3b); 

IMG:

#include <opencv2\opencv.hpp> 
using namespace cv; 

int main(void) 
{ 
    Mat3b img = imread("path_to_image"); 

    imshow("Original", img); 
    waitKey(); 

    Rect r(100,100,200,200); 
    Mat3b roi3b(img(r)); 

    GaussianBlur(roi3b, roi3b, Size(), 10); 

    imshow("After Blur", img); 
    waitKey(); 

    Mat1b roiGray; 
    cvtColor(roi3b, roiGray, COLOR_BGR2GRAY); 

    threshold(roiGray, roiGray, 200, 255, THRESH_BINARY); 

    Mat3b roiGray3b; 
    cvtColor(roiGray, roiGray3b, COLOR_GRAY2BGR); 
    roiGray3b.copyTo(roi3b); 

    imshow("After Threshold", img); 
    waitKey(); 

    return 0; 
} 
+0

你在思考和演示方面非常經典。 – Arjun

1

模糊所需要的區域遵循以下步驟:

cv::Rect roi(x, y, w, h); 
cv::GaussianBlur(image(roi), image(roi), Size(0, 0), 4); 

請點擊此鏈接以獲取更多信息http://docs.opencv.org/modules/core/doc/basic_structures.html#id6

墊::運算符()(範圍rowRange,範圍colRange)

墊:: operator()(const Rect & roi)

+0

如果我想進一步處理,例如ROI中的Canny邊緣檢測,該怎麼辦?在檢測到邊緣後,最終結果無法顯示在原始圖像上。 cv :: Rect roi(x,y,w,h); cv :: GaussianBlur(image(roi),image(roi),Size(0,0),4); cv :: Canny(image(roi),image(roi),50,100); imshow(「image」,image); – Leo

+0

接受已幫助您的答案。完成上述代碼的人。並按照鏈接將該圖片放置到原始圖片請遵循此鏈接相同http://stackoverflow.com/questions/10481411/opencv-copy-an-cvmat-inside-a-roi-of-another – Arjun

1

我對感興趣的區域進行了毛刺並將模糊區塊可以對原始圖像中的模糊區域執行圖像處理操作,也可以在分割區域上執行。

int main() { 

    Mat image; 
    image=imread("Light.jpg",1); 

    // image = cv::imread(argv[1], CV_LOAD_IMAGE_COLOR); 
    Rect roi(100, 100,200, 200); 
    Mat blur; 
    GaussianBlur(image(roi), blur, Size(0, 0), 4); 
    imshow("blurred region",blur); 
    //do some operations on roi 
    imshow("aaaa",image); 
    waitKey(0); 
    return 0; 
} 
相關問題