Сегментация ран с использованием вейвлет-преобразования в OpenCV

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

Какое вейвлет-преобразование подойдет для сегментации ран и несколько советов по его реализации ??

Есть ли лучший способ, чем вейвлет-преобразование в сегментную рану при любых условиях освещения??

Мы также попробовали кластеризацию изображений, которая не удалась.

Вот некоторые тестовые примеры и программа кластеризации, которую мы использовали.

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

#include <iostream>
void show_result(const cv::Mat& labels, const cv::Mat& centers, int height, int width);
int main(int argc, const char * argv[])
{    
        cv::Mat image = cv::imread("kmean.jpg");
        if ( image.empty() ) {
                std::cout << "unable to load an input image\n";
                return 1;
        }
        //cv::cvtColor(image,image,CV_BGR2HSV);
        std::cout << "image: " << image.rows << ", " << image.cols << std::endl;
        assert(image.type() == CV_8UC3);
        cv::imshow("image", image);

        cv::Mat reshaped_image = image.reshape(1, image.cols * image.rows);
        std::cout << "reshaped image: " << reshaped_image.rows << ", " << reshaped_image.cols << std::endl;
        assert(reshaped_image.type() == CV_8UC1);
        //check0(image, reshaped_image);

        cv::Mat reshaped_image32f;
        reshaped_image.convertTo(reshaped_image32f, CV_32FC1, 1.0 / 255.0);
        std::cout << "reshaped image 32f: " << reshaped_image32f.rows << ", " << reshaped_image32f.cols << std::endl;
        assert(reshaped_image32f.type() == CV_32FC1);

        cv::Mat labels;
        int cluster_number = 4;
        cv::TermCriteria criteria(cv::TermCriteria::COUNT, 100, 1);
        cv::Mat centers;
        cv::kmeans(reshaped_image32f, cluster_number, labels, criteria, 1, cv::KMEANS_PP_CENTERS, centers);

        show_result(labels, centers, image.rows,image.cols);

        return 0;
}

void show_result(const cv::Mat& labels, const cv::Mat& centers, int height, int width)
{
        std::cout << "===\n";
        std::cout << "labels: " << labels.rows << " " << labels.cols << std::endl;
        std::cout << "centers: " << centers.rows << " " << centers.cols << std::endl;
        assert(labels.type() == CV_32SC1);
        assert(centers.type() == CV_32FC1);

        cv::Mat rgb_image(height, width, CV_8UC3);
        cv::MatIterator_<cv::Vec3b> rgb_first = rgb_image.begin<cv::Vec3b>();
        cv::MatIterator_<cv::Vec3b> rgb_last = rgb_image.end<cv::Vec3b>();
        cv::MatConstIterator_<int> label_first = labels.begin<int>();

        cv::Mat centers_u8;
        centers.convertTo(centers_u8, CV_8UC1, 255.0);
        cv::Mat centers_u8c3 = centers_u8.reshape(3);

        while ( rgb_first != rgb_last ) {
                const cv::Vec3b& rgb = centers_u8c3.ptr<cv::Vec3b>(*label_first)[0];
                *rgb_first = rgb;
                ++rgb_first;
                ++label_first;
        }
        cv::imshow("tmp", rgb_image);


        cv::waitKey();
}

Would-1 с фоном: (два кластера)

Would-1 с фоном

Would-1 без предыстории:

Был бы-1 без фона

Would-2 с фоном:

Would-2 с фоном

Would-2 без предыстории: (три кластера)

Был бы-2 без фона

Когда мы удаляем фон, мы получаем немного лучшую сегментацию, но для удаления фона мы используем захват-вырез, который зависит от ручного управления. Поэтому нам нужна замена kmean-clustering для сегментации изображения (или) некоторые улучшения в приведенном выше коде для достижения 100% успеха.

Так есть ли лучший способ сегментировать раны??


person Ashok Varma    schedule 05.02.2015    source источник
comment
Кому-либо будет трудно помочь вам, не глядя на некоторые изображения, предпочтительно сопровождаемые выдержками из исходного кода ваших попыток.   -  person Zaphod    schedule 07.02.2015
comment
@Zaphod, я добавил изображения и код. Пожалуйста, проверьте это сейчас.   -  person Ashok Varma    schedule 08.02.2015


Ответы (1)


Вместо того, чтобы пытаться использовать традиционное вейвлет-преобразование, вы можете попробовать вейвлеты типа Хаара, настроенные для задач обнаружения объектов, аналогичные основе интегральных изображений, используемых в Детектор лиц Виолы Джонс. Эта статья Лиенхарта и др., используемая для обнаружения общих объектов, было бы хорошим началом.

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

Надеюсь это поможет.

person Zaphod    schedule 10.02.2015
comment
У меня, к сожалению, нет кода, которым я мог бы поделиться, но документ Лиенхарта очень подробный, и кодировать его несложно. - person Zaphod; 13.02.2015