2016-01-23 5 views
3

Вот что у меня естьOpenCV: Как найти цвет внутри контура/полигона?

im = cv2.imread('luffy.jpg') 
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
ret,thresh = cv2.threshold(gray,127,255,0) 

contours,h = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

for cnt in contours: 

    // return color inside of the contour here 
    mask = np.zeros(cnt.shape[:2],np.uint8) 
    mean = cv2.mean(cant,mask) // I think this is promising but so far it returns arrays with just zeros. I think its because I used np.zeros above to find the mask.... 
    moment = cv2.moments(cnt) //maybe this will help? 

я могу найти нет такой функции OpenCV не встраивается. Я предполагаю, что, возможно, вы можете сделать это с моментами? Как я могу это достичь?

EDIT: с предлагаемым решением, заданным За Лин У меня есть этот входной файл:

enter image description here

и этот вывод изображение:

enter image description here

+0

В одну сторону: вы можете получить область изображения внутри контура, а затем использовать его для дальнейшей обработки. Обрезать внутреннюю область см. Это: http://stackoverflow.com/questions/28759253/how-to-crop-the-internal-area-of-a-contour – Vipul

+0

Я думаю, что лучший способ - обработать гистограмму внутри образ. [Это] (http://www.pyimagesearch.com/2014/01/22/clever-girl-a-guide-to-utilizing-color-histograms-for-computer-vision-and-image-search-engines/) может помочь. – Mahm00d

+0

первая ссылка, кажется, дает пустую белую обрезку, поэтому я не мог ее использовать, чтобы найти цвет. Гистограмма может работать, но она кажется подходящей для создания фактической гистограммы. Я не могу найти способ усреднить значения каждого канала, например. Я обнаружил, что вы можете запустить cv2.mean (cnt, mask) на контуре, чтобы получить средние значения каналов BGR, что кажется многообещающим. Пока нет успеха, но – BigBoy1337

ответ

4

Это получает средний цвет внутри каждого контура и рисует контуры с этим цветом до конечного изображения.

import cv2 
import numpy as np 
im = cv2.imread('/home/zawlin/test.png') 

gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
contours,h = cv2.findContours(gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

final = np.zeros(im.shape,np.uint8) 
mask = np.zeros(gray.shape,np.uint8) 

for i in xrange(0,len(contours)): 
    mask[...]=0 
    cv2.drawContours(mask,contours,i,255,-1) 
    cv2.drawContours(final,contours,i,cv2.mean(im,mask),-1) 

cv2.imshow('im',im) 
cv2.imshow('final',final) 
cv2.waitKey(0) 
+0

Im думает, что это работает, потому что ошибок нет, однако это делает ужасную работу. Вы получаете хорошие результаты? - то же изображение в основном выводится с усредненными цветами ... – BigBoy1337

+0

Я не тестировал, хорош ли результат или нет. Я просто использовал изображение @sturkmen, и у меня тот же результат, что и у него. Может быть, вы можете разместить свой образ? –

+0

Я дал образец в вопросе. очевидно, что он не работает очень хорошо, хотя я не уверен, что причина – BigBoy1337

2

я думаю function mean с маской изображения это единственный способ получить цвет внутри контура, но, к сожалению, я не могу показать его кодом Python.

вы можете получить ограничивающий коробок контура с помощью boundingRect и использовать его, чтобы получить ROI изображений из исходного изображения и двоичных изображений для маскировки (быть в курсе клонирование бинаризированного изображения, потому что findcontour разрушает его)

может быть, образец C++ будет быть полезным

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main(int, char** argv) 
{ 
    /// Load source image 
    Mat src = imread(argv[1]); 
    if (src.empty()) 
    { 
    cerr << "No image supplied ..." << endl; 
    return -1; 
    } 

    /// Convert image to gray 
    Mat src_gray; 
    cvtColor(src, src_gray, COLOR_BGR2GRAY); 
    threshold(src_gray, src_gray, 50, 255, THRESH_BINARY); 
    imshow("src_gray", src_gray); 
    /// Find contours 
    vector<vector<Point> > contours; 
    findContours(src_gray.clone(), contours, RETR_TREE, CHAIN_APPROX_SIMPLE); 

    Mat resImage0 = src.clone(); 
    Mat resImage1 = src.clone(); 
    /// Draw contours 
    for(size_t i = 0; i< contours.size(); i++) 
    { 
     Scalar color = Scalar(0, 0, 255); 
     Rect _boundingRect = boundingRect(contours[i]); 
     Scalar mean_color0 = mean(src(_boundingRect)); 
     Scalar mean_color1 = mean(src(_boundingRect), src_gray(_boundingRect)); 

     drawContours(resImage0, contours, (int)i, mean_color0, FILLED); 
     drawContours(resImage1, contours, (int)i, mean_color1, FILLED); 
    } 

    /// Show in a window 
    imshow("src", src); 
    imshow("resImage0", resImage0); 
    imshow("resImage1", resImage1); 
    waitKey(0); 
    return(0); 
} 

входное изображение (извините за мой бедный английский.):

enter image description here

вывода изображения:

enter image description here enter image description here

Смежные вопросы