Сегментиране на раната с помощта на Wavelet Transform в OpenCV

Опитахме подхода на локална хистограма за сегментиране на рани, който не работи добре за всички видове изображения и след това се научихме да използваме Wavelet transform за сегментиране на рани.

Коя Wavelet трансформация ще бъде добра за сегментиране на рани и някои съвети за прилагането й??

Има ли някакъв по-добър начин от уейвлет трансформацията за сегментна рана при всякакви светлинни условия??

Опитахме също групиране на изображения, което не мина толкова добре.

Ето някои тестови случаи и програма за клъстериране, която използвахме.

#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 с фон

Бихте ли-1 без предистория:

Would-1 без фон

Would-2 с предистория:

Would-2 с фон

Would-2 без фон:(три клъстера)

Would-2 без фон

Когато премахваме фона, получаваме малко по-добра сегментация, но за премахване на фона използваме grab-cut, който разчита на ръчна работа. Така че имаме нужда от заместител на 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)


Вместо да се опитвате да използвате традиционната вълнова трансформация, може да искате да опитате подобни на Хаар вълни, настроени за задачи за откриване на обекти, подобно на основата на интегралните изображения, използвани в Детектор за лице на Виола Джоунс. Тази статия от Lienhart et al, използвана за общо откриване на обекти, би било добро начало.

От външния вид на вашите примерни изображения, вариацията на интензитетите в рамките на малки пикселни квартали в раната е много по-висока, докато кожата без натъртвания изглежда доста еднаква в малки квартали. Документът на Lienhart трябва да може да открива такива вариации - можете или да захраните функциите в настройка за машинно обучение, или просто да правите ръчни наблюдения и да дефинирате прозорците за търсене и свързаните евристики.

Надявам се това да помогне.

person Zaphod    schedule 10.02.2015
comment
За съжаление нямам код, който да споделя, но документът на Lienhart е много подробен и не би трябвало да е много трудно да се кодира. - person Zaphod; 13.02.2015