Сегментация раны с использованием вейвлет-преобразования в 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();
}

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

Будет-1 с фоном

Будет-1 без фона:

Будет-1 без фона

Будет-2 с фоном:

Бы-2 с фоном

Будет-2 без фона:(три кластера)

Будет-2 без фона

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам