图像分割结果的评估

我们在用一个算法对一幅图像进行分割之后,总会面临这样一个问题,分割的结果到底好不好。用眼睛可以看出好坏,但这只是主观的好坏,如何量化的对分割的结果进行评价呢,这是这篇文章我要讨论的主题。

我查阅过很多方法,包括ROC曲线,Dice重合率等等,要么是我理解不好,要么是难以实现。下面的代码,将基于GT(ground truth)图像计算分割图像的分割精度、过分割率、欠分割等指标来评估算法的分割结果。

首先简要介绍一下相关概念

GT(ground truth)图像:我理解的就是含有理论分割结果的图像,用来和结果图像进行比较的参照图像。那么GT图像怎么来,一般通过专家手工勾画出来,得到理论值。当然为避免偶然性,你可以选择多个专家,得到多个GT分割结果,取各项评估参数的平均值。

分割精度:个人理解就是分割准确的面积占GT图像中真实面积的百分比。找了半天找了这么个公式(如下)。

不难理解,其中Rs表示专家手工勾画出的分割图像的参考面积,Ts表示算法分割得到的图像的真实面积,|Rs-Ts|表示错误分割的像素点个数。

过分割率:即分割在GT图像参考面积之外的像素点的比率,计算公式如下:

含义同上,Os表示本不应该包含在分割结果中的像素点个数,实际却在分割结果中的像素点个数。换句话讲,Os中的像素点出现在实际分割图像中,但不出现在理论分割图像Rs中。

欠分割率:即分割在GT图像参考面积之中欠缺的像素点的比率,计算的公式如下:

含义同上,Us表示本应该包含在分割结果中的像素点个数,实际却不在分割结果中的像素点个数。换句话讲,Us中的像素点出现在理论分割图像中,但不出现在实际分割图像中。

好了,理论介绍完了,下面看一下效果和代码吧,我把我做头发分割的结果拿来做一下测试。

测试结果如下:

计算的各类参数如下:

如果大家对我头发分割的算法有疑问或者感兴趣,欢迎给我留言!

下面奉上我的代码:

/*************************************************************************
//为图像分割的结果提供评价标准
//预先人工绘制GT图像作为参考,与分割图像进行过分割率和欠分割率的计算
************************************************************************/

#include <opencv2/opencv.hpp>
#include <iostream>
#include <stdlib.h>

void getCounterImage(IplImage* src,IplImage* test,IplImage* dst);

using namespace std;

FILE *fp;

int main()
{
IplImage* testImg;  // 测试图像;
IplImage* gtImg;   //参照图像;
IplImage* counterImg;  //轮廓图像;
fp = fopen("meanshift 方法.txt","w+");
fprintf(fp,"%s","图像编号           ");
fprintf(fp,"%s","分割准确率           ");
fprintf(fp,"%s","过分割率           ");
fprintf(fp,"%s","欠分割率           ");
int i = 1;
while(i<=5){
fprintf(fp,"%s","\n");
fprintf(fp,"%d",i);
char fileName[100] = "E:\\testdata\\Judge\\om_hair_dilate";
char gtFileName[100] = "E:\\testdata\\Judge\\gtHair";
char NumStr[10];
char JpgStr[10]=".jpg";
char ResStr[100]="res";
itoa(i,NumStr,10);
strcat(fileName,NumStr);
strcat(fileName,JpgStr);
strcat(gtFileName,NumStr);
strcat(gtFileName,JpgStr);
testImg = cvLoadImage(fileName);
gtImg = cvLoadImage(gtFileName);
counterImg = cvCreateImage(cvGetSize(gtImg),8,1);  //单通道图像
cvZero(counterImg);
getCounterImage(gtImg,testImg,counterImg);

cvShowImage("testImage",testImg);

cvShowImage("gtImage",gtImg);
cvMoveWindow("gtImage",0,0);
cvReleaseImage(&counterImg);
char c=cvWaitKey();
if(32==c)
        i++;
}
fclose(fp);
cvWaitKey(0);
}

void getCounterImage(IplImage* src,IplImage* test,IplImage* dst)
{
double SegRate;       //分割准确率;
double OverSegRate;   //过分割率;
double LessSegRate;   //欠分割率;
CvScalar BLACK = CV_RGB(0,0,0);
CvScalar WHITE = CV_RGB(255,255,255);

for (int i = 0; i <src->height;i++)
for (int j = 0; j <src->width;j++)
{
CvScalar pixel = cvGet2D(src,i,j);
if(pixel.val[2]>200 && pixel.val[0]<50 && pixel.val[1]<50)
{
cvSet2D(dst,i,j,BLACK);
}
else
cvSet2D(dst,i,j,WHITE);
}
//cvShowImage("test",dst);
cvThreshold(dst,dst,150,255,CV_THRESH_BINARY_INV);
//查找轮廓;
CvSeq *pContour = NULL;
CvSeq *pConInner = NULL;
CvMemStorage *pStorage = NULL;
if(dst)
{
pStorage = cvCreateMemStorage(0);
cvFindContours(dst,pStorage,&pContour,sizeof(CvContour), CV_RETR_EXTERNAL , CV_CHAIN_APPROX_SIMPLE);
cvDrawContours(dst, pContour, CV_RGB(255, 255, 255), CV_RGB(255,255,255), -1, CV_FILLED, 8, cvPoint(0, 0)); 
}

cvNamedWindow("counter",0);
cvThreshold(dst,dst,150,255,CV_THRESH_BINARY_INV);
cvShowImage("counter",dst);
//cvShowImage("judge",test);
//cvSaveImage("gt1.jpg",dst);

/**开始计算过分割率和欠分割率**/
int x,y;
int SegNum=0;   //分割准确的像素点个数;
int OverSegNum=0;   //过分割的像素点个数;
int LessSegNum=0;   //欠分割的像素点个数;
int GTNum=0;     //真实像素点个数;
for (int i = 0; i <dst->height;i++)
for (int j = 0; j <dst->width;j++)
{
x = cvGet2D(test,i,j).val[0]; //分割图像
y = cvGet2D(dst,i,j).val[0];  //参照图像
if(x==0)
SegNum++;
if(y==0)
{
GTNum++;
if(x!=0)
LessSegNum++;
}
else if(x==0)
OverSegNum++;
}

SegRate = 1-(double)(abs(GTNum-SegNum))/GTNum; //分割准确率;
OverSegRate = (double)OverSegNum/(GTNum+OverSegNum);   //过分割率;
LessSegRate = (double)LessSegNum/(GTNum+OverSegNum);   //欠分割率;
cout<<"分割准确率:"<<SegRate<<endl;
cout<<"过分割率:"<<OverSegRate<<endl;
cout<<"欠分割率:"<<LessSegRate<<endl;
fprintf(fp,"%s","                  ");
fprintf(fp,"%f",SegRate);
fprintf(fp,"%s","             ");
fprintf(fp,"%f",OverSegRate);
fprintf(fp,"%s","              ");
fprintf(fp,"%f",LessSegRate);

}

Junzzy所写,欢迎大家指正!
--------------------- 
作者:Junzzy 
来源:CSDN 
原文:https://blog.csdn.net/zhuason/article/details/52989091 
版权声明:本文为博主原创文章,转载请附上博文链接!

03-图像分割效果评估相关推荐

  1. 聚类效果评估、内部指标(Jaccard系数、FM指数、Rand指数)、外部指标(DB指数、Dunn指数)、轮廓系数(Silhouette Coefficient)

    聚类效果评估.内部指标(Jaccard系数.FM指数.Rand指数).外部指标(DB指数.Dunn指数).轮廓系数(Silhouette Coefficient) 目录

  2. 热门解读:大促的活动设计及效果评估的优化

    在零售行业,大促活动在全年整体活动中占据非常重要的地位.零售行业的活动运营分为日常活动运营和节日促销活动运营.日常活动运营,比如限时秒杀.多人拼团购买.猜你喜欢等:节日促销运营,比如元宵节.情人节.妇 ...

  3. Tensorlfow2.0 二分类和多分类focal loss实现和在文本分类任务效果评估

    Tensorlfow2.0 二分类和多分类focal loss实现和在文本分类任务效果评估 前言 二分类 focal loss 多分类 focal loss 测试结果 二分类focal_loss结果 ...

  4. 机器学习第十篇:如何评价模型效果评估

    前言 前面的推文中介绍了几种常用的机器学习算法,每个算法都有各自的优劣势,我们应该选择根据每个算法的优劣势去合理的选择适合我们需求的算法,以此达到效果最优,那么什么样的效果才是最优的,用什么来衡量这个 ...

  5. 机器学习模型效果评估

    总第96篇 前言 前面的推文中介绍了几种常用的机器学习算法,每个算法都有各自的优劣势,我们应该选择根据每个算法的优劣势去合理的选择适合我们需求的算法,以此达到效果最优,那么什么样的效果才是最优的,用什 ...

  6. 聚类效果评估指标总结

    前言 实际工作中经常会用到一些聚类算法对一些数据进行聚类处理,如何评估每次聚类效果的好坏?可选的方法有1.根据一些聚类效果的指标来评估:2.直接打点.今天就主要总结下这段时间了解的聚类效果评估指标.废 ...

  7. 拒绝捞回中的效果评估与策略二次调用

    在精细化管理的当下,拒绝捞回经常作为重要的辅助工具帮我们来从拒绝客户中寻找偏好的客户进行授信. 常规的捞回方法,会对命中某些策略的客群进行调整,这里面我们会应用模型分和策略调优等手段进行相关的捞回操作 ...

  8. python + sklearn ︱分类效果评估——acc、recall、F1、ROC、回归、距离

    之前提到过聚类之后,聚类质量的评价: 聚类︱python实现 六大 分群质量评估指标(兰德系数.互信息.轮廓系数) R语言相关分类效果评估: R语言︱分类器的性能表现评价(混淆矩阵,准确率,召回率,F ...

  9. 机器学习---推荐系统效果评估NDCG

    参考连接:http://www.cnblogs.com/supersteven/archive/2012/09/01/2666565.html 首先非常感谢作者不辞辛苦整理与分享. 根据作者描述以及提 ...

  10. 热门解读:社交裂变的拉新效果评估及优化

    目前我国零售行业全面数字化已成趋势,数字化力量在驱动零售新发展.重塑零售新增长格局中扮演着越来越重要的角色.对每个零售品牌商来说,微信这一庞大的私域流量池,囊括百万甚至千万的客户.社交裂变已成为品牌商 ...

最新文章

  1. 2020-10-26关于虚拟机中的HWADDR和MACADDR地址
  2. 思考一个问题:如何重现主从备份失败的案例
  3. java 性能 排序_Java常用排序算法及性能测试集合
  4. python中元组可以比较大小吗_python元组比较
  5. 数字拆分为斐波那契数列_检查数字是否为斐波那契
  6. 详解GaussDB(for MySQL)服务:复制策略与可用性分析
  7. html5连接mysql数据库操作_html5-本地数据库的操作
  8. 关于类型的存储时间和链接
  9. [转]Android 超高仿微信图片选择器 图片该这么加载
  10. Python中and(逻辑与)计算法则
  11. FPGA实现实时运动目标检测verilog
  12. weblogic windows 打补丁_weblogic的版本及打补丁
  13. 为什么使用阿里普惠体没效果
  14. 如何恢复微信聊天记录,3个简单方法
  15. 认真总结 HTTP常见面试题(持续更新)
  16. 一个实用的实时毛发渲染及着色方法
  17. vue入门(一)----工程vue_sell
  18. VMware收费太贵?试试这款更轻量级的虚拟机,完全免费!
  19. 「Medical Image Analysis」 Note on 朱文涛博士学位论文
  20. 消息协议 AMQP 及MQTT ,STOMP,JMS的概念和基本理解

热门文章

  1. 计算机word基础知识ppt,计算机一级练习题(word 、excel、ppt以及计算机基础知识练习)...
  2. 【Red Hat7创建/扩容/删除逻辑卷 #步骤非常非常详细】
  3. web安全之Webshell管理工具
  4. TTL接口笔记本液晶屏改液晶显示器
  5. 如何解决Vmware Ubuntu网络问题(适用于锐捷客户端用户)
  6. HTML5期末大作业:美食网页主题网站设计与实现——HTML+CSS+JavaScript月饼美食食品企业网站html模板9页面
  7. 计算机论文结束语致谢,毕业论文致谢结束语3篇
  8. 苹果手机升级13无法开机_苹果手机无法开机的解决方法
  9. 【193】Lumen 中文文档
  10. 用easywechat插件做微信支付