Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++]Обработка изображений (шумоподавление)


Автор: fredz 10.1.2013, 23:57
Всем привет! Помогите разобраться. Есть задача: сделать программу для уменьшение шума на изображении  путем усреднения серии изображений. В ходе решения этого вопроса идея и основа программы (консольное приложение) была заимствованна у автора с его страницы  http://www.aishack.in/2010/01/noise-reduction-by-averaging/
Там же рассказано о принципе усреднения. Используется OpenCV.
Вот еще интересная ссылка https://github.com/sinotov/no-noise
код программы:
Код

#include <opencv/cv.h>
#include <opencv/highgui.h>

using namespace cv;

int main()
{

        IplImage* imgRed[25];
        IplImage* imgGreen[25];
        IplImage* imgBlue[25];
        for(int i=0;i<25;i++)
            {
                IplImage* img;
                char filename[150];
                sprintf(filename, "D:\image\20130110_211620.jpg", (i+1)); // у автора было так sprintf(filename, "%d.jpg", (i+1));
                img = cvLoadImage(filename);
                imgRed[i] = cvCreateImage(cvGetSize(img), 8, 1);
                imgGreen[i] = cvCreateImage(cvGetSize(img), 8, 1);
                imgBlue[i] = cvCreateImage(cvGetSize(img), 8, 1);
                cvSplit(img, imgRed[i], imgGreen[i], imgBlue[i], NULL);
                cvReleaseImage(&img);
            }
        CvSize imgSize = cvGetSize(imgRed[0]);
            IplImage* imgResultRed = cvCreateImage(imgSize, 8, 1);
            IplImage* imgResultGreen = cvCreateImage(imgSize, 8, 1);
            IplImage* imgResultBlue = cvCreateImage(imgSize, 8, 1);

            IplImage* imgResult = cvCreateImage(imgSize, 8, 3);
            for(int y=0;y<imgSize.height;y++)
                {
                    for(int x=0;x<imgSize.width;x++)
                    {
                        int theSumRed=0;
                        int theSumGreen=0;
                        int theSumBlue=0;
                        for(int i=0;i<25;i++)
                        {
                            theSumRed+=cvGetReal2D(imgRed[i], y, x);
                            theSumGreen+=cvGetReal2D(imgGreen[i], y, x);
                            theSumBlue+=cvGetReal2D(imgBlue[i], y, x);
                        }
                        theSumRed = (float)theSumRed/25.0f;
                        theSumGreen = (float)theSumGreen/25.0f;
                        theSumBlue = (float)theSumBlue/25.0f;
                        cvSetReal2D(imgResultRed, y, x, theSumRed);
                        cvSetReal2D(imgResultGreen, y, x, theSumGreen);
                        cvSetReal2D(imgResultBlue, y, x, theSumBlue);
                    }
                }
            cvMerge(imgResultRed, imgResultGreen, imgResultBlue, NULL, imgResult);
                cvNamedWindow("averaged");
                cvShowImage("averaged", imgResult);
                cvWaitKey(0);

                return 0;
            }

Но при ее запуске происходит что-то не так, т.е. собирается без ошибок, но вылетает сообщение "Прекращена работа программы  test.exe". Объясните пожалуйста в чем может быть дело.
Здесь можно скачать изображения http://yadi.sk/d/EsgEJjAc1lvQz
Если у Вас есть другие идеи и решения этой задачи - буду только рад smile 
Заранее Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)