2012-02-17 14 views
7

Przeczytałem w wideo w Visual Studio przy użyciu openCV i przekonwertowałem go na skalę szarości, a następnie użyłem funkcji CV_THRESH_BINARY, aby przekonwertować ją na obraz binarny. W ramkach występują jednak dziury i szum. Jaki jest prosty sposób na usunięcie hałasu lub dziur? Czytałem o funkcjach Erode i Dilate w openCV, ale nie jestem zbyt jasny, jak z nich korzystać. to jest mój kod do tej pory. Jeśli ktokolwiek może mi pokazać, jak włączyć usuwanie szumów do mojego kodu, byłoby to bardzo cenne.usuwanie szumów w obrazie binarnym za pomocą openCV

#include "cv.h" 
#include "highgui.h" 

int main(int argc, char* argv) { 

CvCapture *capture = NULL; 
capture = cvCaptureFromAVI("C:\\walking\\lady walking.avi"); 
if(!capture){ 
    return -1; 
} 

IplImage* color_frame = NULL; 
IplImage* gray_frame = NULL ; 
int thresh_frame = 70; 

int frameCount=0;//Counts every 5 frames 
cvNamedWindow("Binary video", CV_WINDOW_AUTOSIZE); 

while(1) { 
    color_frame = cvQueryFrame(capture);//Grabs the frame from a file 
    if(!color_frame) break; 
    gray_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height),  color_frame->depth, 1); 
    if(!color_frame) break;// If the frame does not exist, quit the loop 

    frameCount++; 
    if(frameCount==5) 
    { 
     cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY); 
     cvThreshold(gray_frame, gray_frame, thresh_frame, 255, CV_THRESH_BINARY); 
     cvShowImage("Binary video", gray_frame); 
     frameCount=0; 
    } 
    char c = cvWaitKey(33); 
    if(c == 27) break; 
} 

cvReleaseImage(&color_frame); 
cvReleaseImage(&gray_frame); 
cvReleaseCapture(&capture); 
cvDestroyWindow("Grayscale video"); 

return 0; 
} 

Odpowiedz

9

ZASTRZEŻENIE: Trudno jest podać dobrą odpowiedź, ponieważ podałeś bardzo mało informacji. Jeśli umieścisz swój obraz przed i po binaryzacji, będzie to znacznie łatwiejsze. Jednak postaram się podać kilka wskazówek.

Jeśli otwory są dość duże, to prawdopodobnie wartość progowa jest nieprawidłowa, spróbuj zwiększyć lub zmniejszyć ją i sprawdź wynik. Możesz wypróbować:

cv::threshold(gray_frame, gray_frame, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); 

Spowoduje to automatyczne obliczenie wartości progowej. Jeśli nie możesz znaleźć dobrej wartości progowej, spróbuj zastosować algorytmy progu adaptacyjnego, opencv ma funkcję adaptiveThreshold(), ale nie jest tak dobra.

Jeśli otwory i hałas są raczej małe (co kilka pikseli), można spróbować niektóre z następujących:

  • Korzystanie otwarcia (erozja, obok dylatacyjny), aby usunąć biały szum i zatykania (dylatacji, następna erozja) do małego czarnego szumu. Pamiętaj jednak, że otwarcie, podczas usuwania białego szumu, wzmocni również czarny szum i na odwrót.

  • Mediana rozmycia PO wykonaniu progu. Może usuwać małe zakłócenia, zarówno czarno-białe, jak i zachowując kolory (obraz będzie binarny) i, z możliwymi małymi błędami, kształtami. Zastosowanie mediany rozmycia PRZED binaryzacją może również pomóc zmniejszyć mały hałas.

+0

Przykro mi z powodu braku zdjęć, ale dziękuję bardzo za pomoc.Użyłem funkcji cvErode, która usunęła niektóre z dziur w obrazie, ale spróbuję także mediany rozmycia. Kiedy wspomniałeś o używaniu otwierania i zamykania, czy muszę używać ich razem, czy też CV_MOP_OPEN lub CV_MOP_CLOSE? –

+0

Nadal możesz je dostarczyć :) Możesz użyć jednego z nich lub obu, jeden po drugim, to zależy od tego, co próbujesz uzyskać. Po prostu sprawdź wyniki i eksperymentuj. –

+0

Sprawdziłem wyniki i zdecydowałem, że lepsze wyniki uzyskano dzięki funkcjom Erode i Dilate, więc wykorzystam je jeden po drugim. W każdym razie nie wiem, jak dostarczyć obrazy, ponieważ jestem nowy w stackoverflow:/Bardzo mi przykro. Obecnie pracuję nad projektem przetwarzania obrazu, który obejmuje C++ i openCV. Opiera się na rozpoznawaniu ruchu, więc gdybym zadał więcej pytań, byłbym bardzo wdzięczny, gdybyś mógł udzielić pomocy, ponieważ już byłeś bardzo pomocny. Dziękuję :) –

1

Można spróbować użyć Smooth funkcję z CV_MEDIAN zanim zrobisz progowanie.

+0

Czy osiągnąłby ten sam rezultat co funkcje erodowania i rozszerzania? Czy znasz korzystanie z tych funkcji? –

+0

możesz używać otwierania i zamykania (erozja + dylatacja i odwrotnie), wyraźnie musisz dostroić rozmiar jądra – andrea

+0

Mogę użyć funkcji otwierania lub zamykania, czy też muszę ich używać razem? –

Powiązane problemy