【问题标题】:Wound Segmentation using Wavelet Transform in OpenCV在 OpenCV 中使用小波变换进行伤口分割
【发布时间】:2015-04-05 08:32:10
【问题描述】:

我们尝试使用局部直方图方法进行伤口分割,但该方法不适用于所有类型的图像,然后我们教使用小波变换进行伤口分割。

哪种小波变换有利于伤口分割以及实现它的一些技巧??

有没有比小波变换更好的方法来分割所有光照条件下的伤口??

我们还尝试了图像聚类,但效果不佳。

这是我们使用的一些测试用例和聚类程序。

#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 with Background :(两个集群)

Would-1 没有背景:

Would-2 带背景:

Would-2 没有背景:(三个集群)

当我们移除背景时,我们得到了更好的分割,但是为了移除背景,我们使用了依赖手动操作的抓取切割。因此,我们需要替代 kmean-clustering 来分割图像(或)对上述代码进行一些改进,以实现 100% 的成功案例。

那么有没有更好的分割伤口的方法??

【问题讨论】:

  • 如果不看一些图像,任何人都很难帮助您,最好附上您迄今为止尝试的源代码摘录。
  • @Zaphod 我添加了图像和代码。请立即检查。

标签: opencv image-processing image-segmentation wavelet wavelet-transform


【解决方案1】:

不要尝试使用传统的小波变换,您可能想尝试针对目标检测任务调整的类似 Haar 的小波,类似于 Viola Jones face detector 中使用的积分图像的基础。 This paper by Lienhart et al,用于通用对象检测,将是一个好的开始。

从您的示例图像的外观来看,伤口中小像素区域内的强度变化要高得多,而小区域中未擦伤的皮肤似乎相当均匀。 Lienhart 论文应该能够检测到这种变化 - 您可以将这些特征输入到机器学习设置中,或者只是进行手动观察并定义搜索窗口和相关的启发式方法。

希望这会有所帮助。

【讨论】:

  • 很遗憾,我没有任何代码可以分享,但是 Lienhart 论文非常详细,编写代码应该不会很困难。
猜你喜欢
  • 2013-12-03
  • 1970-01-01
  • 2018-10-23
  • 2012-05-23
  • 2019-03-19
  • 2022-07-06
  • 2013-04-10
  • 1970-01-01
  • 2017-12-15
相关资源
最近更新 更多