簡體   English   中英

基於從處理所述源圖像獲得的canny邊緣輪廓,在opencv中分割源圖像

[英]segmentation of the source image in opencv based on canny edge outline attained from processing the said source image

我有一個源圖像。 我需要從中分割特定部分並將其另存為另一個圖像。 我有需要分割的部分的精確輪廓,但是如何使用它來剪切源圖像中的部分? 我附上了源圖像和canny邊緣輪廓。 請幫幫我,建議我一個解決方案。

來源圖片

Canny邊緣

EDIT-1:Alexander Kondratskiy,這是填寫邊界的意思嗎? 在此輸入圖像描述

編輯2:據Kannat說,我已經這樣做了 源圖像與輪廓

現在,如何將輪廓外部和內部的區域分成兩個單獨的圖像?

編輯3-我想到了'和 - 面具和輪廓襯里的源圖像。因為我使用C,我有一點困難。 這是我用來的代碼和: -

            hsv_gray = cvCreateImage( cvSize(seg->width, seg->height), IPL_DEPTH_8U, 1 );                       
                    cvCvtColor( seg, hsv_gray, CV_BGR2GRAY );                       
                    hsv_mask=cvCloneImage(hsv_gray);
            IplImage* contourImg =cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );                      
            IplImage* newImg=cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );
            cvAnd(contourImg, hsv_mask,newImg,NULL);

我總是得到不匹配大小或類型的錯誤。 我調整了大小,但似乎無法調整類型,因為一個(hsv_mask)是1個通道,其他是3個通道。

@ kanat-我也嘗試了你的邊界但似乎無法以C格式進入。

您可以填充由canny-edge檢測器創建的邊界,並將其用作原始圖像上的alpha蒙版。

在第二個圖像上使用cv::findContours來查找段的輪廓。 然后使用cv::boundingRect查找該段的邊界框。 之后,您可以創建矩陣並從第二個圖像中保存在其中的裁剪邊界框(因為我看到它是二進制圖像)。 要裁剪所需區域,請使用此:

cv::getRectSubPix(your_image, BB_size, cv::Point(BB.x + BB.width/2, BB.y + BB.height/2), new_image) 然后你就可以節省new_image使用cv::imwrite 而已。

編輯:

如果您只找到一個輪廓,那么使用它(否則您將遍歷找到的輪廓的元素)。 以下代碼顯示了這些步驟,但很抱歉我現在無法測試它:

std::vector<std::vector<cv::Point>> contours;
// cv::findContours(..., contours, ...);
cv::Rect BB = cv::boundingRect(cv::Mat(contours[0]));
cv::Mat new_image;
cv::getRectSubPix(your_image, BB.size(), cv::Point(BB.x + BB.width/2, 
BB.y + BB.height/2), new_image);
cv::imwrite("new_image_name.jpg", new_image);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM