Удаление шума в двоичном изображении с использованием OpenCV

StackOverflow https://stackoverflow.com/questions/9323384

Вопрос

Я прочитал в видео в Visual Studio, используя OpenCV и преобразовал его в GreyScale, затем использовал функцию CV_THRESH_BININAL для преобразования его в двоичное изображение. Тем не менее, в кадрах есть отверстия и шум. Какой простой способ удалить шум или отверстия? Я прочитал функции Erode и Delat в 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;
}
Это было полезно?

Решение

Отказ от ответственности: трудно дать хороший ответ, потому что вы предоставили очень мало информации. Если бы вы разместили свое изображение до и после бинаризации, это будет намного проще. Тем не менее, я постараюсь дать некоторые подсказки.

Если отверстия довольно большие, то, вероятно, пороговое значение неверно, попробуйте увеличить или уменьшить их и проверить результат. Можешь попробовать

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

Это автоматически рассчитывает пороговое значение. Если вы не можете найти хорошую пороговую ценность, то попробуйте некоторые алгоритмы адаптивного порога, OpenCV выполняет функцию AdaptiveThreshold (), но это не так хорошо.

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

  • Использование отверстия (эрозия, следующая дилатация) для удаления белого шума и закрытия (дилатация, следующая эрозия) до небольшого черного шума. Но помните, что это отверстие, удаляя белый шум, также укрепит черный шум и наоборот.

  • Медиана размытия после того, как вы делаете пороговое значение. Он может удалить небольшой шум, как черно -белый, сохраняя при этом цвета (изображение будет наглядно будет двоичным) и, с возможными небольшими ошибками, формами. Применение среднего размытия перед бинаризацией также может помочь уменьшить небольшой шум.

Другие советы

Вы можете попробовать использовать Гладкий; плавный функционировать с CV_MEDIAN Прежде чем сделать пороговое значение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top