Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Пороговый метод фильтрации изображения, убрать шумы с изображения 
:(
    Опции темы
Чистый
Дата 5.1.2014, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 23.7.2009

Репутация: нет
Всего: нет



В общем надо реализовать данный метод, но я видать что-то упускаю, так как результаты меня не впечатляют:

clear_img - исходное изображение
user posted image

img_3_noise - исходное изображение с 3% шума
user posted image

img_restore_porog_1_25 - восстановленное изображение с порогом 1,25 и окном фильтра 5х1
user posted image

img_restore_porog_2_42 - восстановленное изображение с порогом 2,42 и окном фильтра 5х1
user posted image

img_restore_porog_4_59 - восстановленное изображение с порогом 4,59 и окном фильтра 3х1
user posted image

img_restore_porog_9_5 - восстановленное изображение с порогом 9,05 и окном фильтра 3х1
user posted image

функция фильтрации имеет такой вид (окно фильтра 5x1):
Код

void MainWindow::restore_image()
{
    int r,g,b;
    float porog = ui->dblPorog->value(), s;
    QImage tmp = ui->lblImage->pixmap()->toImage();
    int width = tmp.width()-1, height=tmp.height();
    QColor pixel, pixel_left, pixel_right, pixel_left_2, pixel_right_2;
    for(int j=0;j<height-1;j++)
    {
        for(int i=2;i<width-2;i++)
        {
            pixel_left_2 = tmp.pixel(i-2,j);
            pixel_left = tmp.pixel(i-1,j);
            pixel = tmp.pixel(i,j);
            pixel_right = tmp.pixel(i+1,j);
            pixel_right_2 = tmp.pixel(i+2,j);
            r=(pixel_left.red()+pixel_right.red()+pixel_left_2.red()+pixel_right_2.red())/4;
            g=(pixel_left.green()+pixel_right.green()+pixel_left_2.green()+pixel_right_2.green())/4;
            b=(pixel_left.blue()+pixel_right.blue()+pixel_left_2.blue()+pixel_right_2.blue())/4;
            s=fabs((0.3*pixel.red()+0.59*pixel.green()+0.11*pixel.blue()))-fabs((0.3*r+0.59*g+0.11*b));
            //qDebug()<< QString("Результат: %1\t Порог: %2").arg(s).arg(porog);
            if(s > porog)
            {
                  pixel.setRgb(r,g,b);
            }
            tmp.setPixel(i,j,pixel.rgb());
        }
    }
    pix = QPixmap::fromImage(tmp);
    ui->lblImage->setPixmap(pix);
}


функция фильтрации имеет такой вид:  окно фильтра 3x1 
Код

oid MainWindow::restore_image()
{
    int r,g,b;
    float porog = ui->dblPorog->value(), s;
    QImage tmp = ui->lblImage->pixmap()->toImage();
    int width = tmp.width()-1, height=tmp.height();
    QColor pixel, pixel_left, pixel_right/*, pixel_left_2, pixel_right_2*/;
    for(int j=0;j<height-1;j++)
    {
        for(int i=2;i<width-2;i++)
        {
            pixel_left = tmp.pixel(i-1,j);
            pixel = tmp.pixel(i,j);
            pixel_right = tmp.pixel(i+1,j);
            r=(pixel_left.red()+pixel_right.red())/2;
            g=(pixel_left.green()+pixel_right.green())/2;
            b=(pixel_left.blue()+pixel_right.blue())/2;
            s=fabs((0.3*pixel.red()+0.59*pixel.green()+0.11*pixel.blue()))-fabs((0.3*r+0.59*g+0.11*b));
            //qDebug()<< QString("Результат: %1\t Порог: %2").arg(s).arg(porog);
            if(s > porog)
            {
                  pixel.setRgb(r,g,b);
            }
            tmp.setPixel(i,j,pixel.rgb());
        }
    }
    pix = QPixmap::fromImage(tmp);
    ui->lblImage->setPixmap(pix);
}

PM MAIL ICQ   Вверх
tzirechnoy
Дата 5.1.2014, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



1) Хорошо бы приводить компилируемый код. Из вежливости, хотя бы. Да и для себя полезно: дописывать за Вас то, что Вы недописали жэлающих найдётся строго меньшэ, чем тех, которые возьмут то, с чем можно играться и поиграются -- соответственно, меньшэ людей смогут осмыслить Ваш код и что-то потом, возможно, предложыть.

2) Оригинальное (зашумлённое) изображэние при анализе должно оставаться оригинальным. Не надо его менять -- это делает фильтр более грустным. Это, вообще, подразумевается -- что фильтр имеет на входе исходное изображэние, и получает новое. Абстрактные описания алгоритмов фильтров рассчитаны именно на это, да там и переменные чаще всего разные.
Исключения, когда можно объединить исходное и результирующее изображэние в одном месте памяти -- довольно редки (ну, точнее, дажэ в этом случае можно -- но требует некоторых ухищрений с хранением изменённого окна для будущих точек).

3) По очевидным причинам, порог должэн быть большэ 1/[размер окрестности] от большынства значений выбросов. Это при условии, что окрестности большынства выбросов не содержат другого выброса -- а если содержат, то ещё надо умножыть на нормальное количество выбросов в окрестности. Собственно, когда это не так, мы видим, что происходит: вместо того, чтобы уничтожаться -- импульсные выбросы расползаются на соседние точки.
Для размера окрестности 4 (при матрицэ 5x1), и произвольных значениях яркости от 0 до 255 -- мы получаем вменяемые пороги где-то в районе 32..64
Для размера окрестности 2.... тут я лучшэ перейду к следующему вопросу.

4) Зачем Вы берёте такие странные окна? Ну да, на таких окнах понять что-то очень сложно. Попробуйте взять пять точек подряд и определить, какую из них надо выкинуть. Берите квадратные, притом 3x3 -- это в общем маловато, лучшэ хотя бы 5x5.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.