//test

#include "stdafx.h"

#include "cxcore.h"

#include "cv.h"

#include "highgui.h"

// 内轮廓填充

// 参数:

// 1. pBinary: 输入二值图像,单通道,位深IPL_DEPTH_8U。

// 2. dAreaThre: 面积阈值,当内轮廓面积小于等于dAreaThre时,进行填充。

void FillInternalContours(IplImage *pBinary, double dAreaThre)

{

double dConArea;

CvSeq *pContour = NULL;

CvSeq *pConInner = NULL;

CvMemStorage *pStorage = NULL;

// 执行条件

if (pBinary)

{

// 查找所有轮廓

pStorage = cvCreateMemStorage(0);

cvFindContours(pBinary, pStorage, &pContour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);

// 填充所有轮廓

cvDrawContours(pBinary, pContour, CV_RGB(255, 255, 255), CV_RGB(255, 255, 255), 2, CV_FILLED, 8, cvPoint(0, 0));

// 外轮廓循环

int wai = 0;

int nei = 0;

for (; pContour != NULL; pContour = pContour->h_next)

{

wai++;

// 内轮廓循环

for (pConInner = pContour->v_next; pConInner != NULL; pConInner = pConInner->h_next)

{

nei++;

// 内轮廓面积

dConArea = fabs(cvContourArea(pConInner, CV_WHOLE_SEQ));

printf("%f\n", dConArea);

if (dConArea <= dAreaThre)

{

cvDrawContours(pBinary, pConInner, CV_RGB(255, 255, 255), CV_RGB(255, 255, 255), 0, CV_FILLED, 8, cvPoint(0, 0));

}

}

}

printf("wai = %d, nei = %d", wai, nei);

cvReleaseMemStorage(&pStorage);

pStorage = NULL;

}

}

int Otsu(IplImage* src)

{

int height=src->height;

int width=src->width;

//histogram

float histogram[256] = {0};

for(int i=0; i

{

unsigned char* p=(unsigned char*)src->imageData + src->widthStep * i;

for(int j = 0; j

{

histogram[*p++]++;

}

}

//normalize histogram

int size = height * width;

for(int i = 0; i

{

histogram[i] = histogram[i] / size;

}

//average pixel value

float avgValue=0;

for(int i=0; i

{

avgValue += i * histogram[i];  //整幅图像的平均灰度

}

int threshold;

float maxVariance=0;

float w = 0, u = 0;

for(int i = 0; i

{

w += histogram[i];  //假设当前灰度i为阈值, 0~i 灰度的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例

u += i * histogram[i];  // 灰度i 之前的像素(0~i)的平均灰度值: 前景像素的平均灰度值

float t = avgValue * w - u;

float variance = t * t / (w * (1 - w) );

if(variance > maxVariance)

{

maxVariance = variance;

threshold = i;

}

}

return threshold;

}

int main()

{

IplImage *img = cvLoadImage("c://temp.jpg", 0);

IplImage *bin = cvCreateImage(cvGetSize(img), 8, 1);

int thresh = Otsu(img);

cvThreshold(img, bin, thresh, 255, CV_THRESH_BINARY);

FillInternalContours(bin, 200);

cvNamedWindow("img");

cvShowImage("img", img);

cvNamedWindow("result");

cvShowImage("result", bin);

cvWaitKey(-1);

cvReleaseImage(&img);

cvReleaseImage(&bin);

return 0;

}

matlab灰度图孔洞填充,OpenCV图像内轮廓填-孔洞填充相关推荐

  1. Python使用openCV把原始彩色图像转化为灰度图、使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本)、基于自适应阈值预处理(adaptive thresholding)方法

    Python使用openCV把原始彩色图像转化为灰度图.使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本).基于自适应阈值预处理(adaptive thresholding)方法 目录

  2. matlab灰度图孔洞填充,一种深度图像空洞的自动填充方法与流程

    本发明涉及深度图像空洞填充技术,从彩色图像的结构相似性出发,求解空洞像素点的多尺度结构相似性,将空洞像素分为平滑区域空洞像素和非平滑区域空洞像素,并针对不同的空洞像素,采用不同的填充算法.在平滑区域空 ...

  3. cv2 inrange灰度图_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

  4. matlab灰度图转伪彩色,[转载]灰度图转伪彩色图和彩虹图,基于OpenCV 2.4.3

    做东西需要用到灰度转伪彩显示,毕竟嘛,人眼对彩色的分辨远远高于对灰度的分辨. 本来想这么成熟的东西网上肯定有代码,我勒个擦,找了一圈都是不知所云的东西,还是自己写一个吧!!!! 废话不说了,代码是码农 ...

  5. matlab灰度图转rgb原理,RGB图像转化为灰度图原理以及MATLAB实现

    RGB图像转化为灰度图原理以及MATLAB实现 1 原理 在RGB彩色模型中表示的图像由三个分量图像组成,每种原色一幅分量图像.利用MATLAB对图像进行读取,可以知道存储RGB图像数据为256*25 ...

  6. python 灰度图转矩阵_图像转换矩阵

    一.Python pillow模块 pip install pillow 二.使用 from PIL import Image import numpy as np def loadImage(): ...

  7. matlab灰度图上色代码改进

    原例程代码地址 例程代码 代码简要分析 1.首先将灰度图转换为特殊的rgb图像(将灰度单通道扩展为rgb三通道) 2.将rgb三通道转换为Ycrbr三通道 3.根据Y分量对两张图进行匹配,用彩图Y分量 ...

  8. matlab 灰度图与索引图

    P=imread('lem.jpg') subplot(2,2,1) imshow(P) title('原版雷姆') L=rgb2gray(P) subplot(2,2,2) imshow(L) ti ...

  9. OpenCV图像的轮廓的匹配

    一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮廓和另一个抽象模板. 矩 比较两个轮廓最简洁的方式是比较他们的轮廓矩.这里先简短介绍一个矩的含义.简单的说 ...

最新文章

  1. mysql获取当前时间,及其相关操作
  2. Unity 中渲染顺序的理解以及一些坑点 以及2.5D游戏中的渲染排序解决方案
  3. php多个文件上传代码,PHP单文件上传类或多文件上传类源码
  4. 03_Influxdb数据库的简单操作
  5. CCF202012-1 期末预测之安全指数
  6. 【IDEA】IDEA 设置 字体 可以滚轮 改变大小
  7. 利用指针数组计算2个3行4列矩阵的和_[剑指 Offer] 04. 二维数组中的查找
  8. mongodb的学习过程
  9. Quartz 触发器、过期触发策略 、排它日历、数据持久化
  10. solr6 mysql增量更新_solr 的全量更新与增量更新
  11. 关于ISIC数据集如何下载的问题
  12. Java IO 和 NIO的区别
  13. 江娱互动:游戏领域 Serverless 架构探索之路
  14. 360安全卫士安装不了此程序被组策略阻止
  15. 面对互联网寒冬裁员潮,HR都在干什么?
  16. DataGear 制作Excel动态数据可视化图表
  17. 精准大数据获客——移动 联通 电信运营商大数据分析_营销
  18. 解决Flutter Android sdkmanager tool not found
  19. 卡尔曼滤波器的实用方法及其实现方法
  20. Python 员工工时汇总

热门文章

  1. 【uniapp】给图片添加水印
  2. Java实现Excel导入导出操作详解
  3. 【项目问题】PM2管理器运行报错: Error: bind EADDRINUSE null:8360(阿里云服务器)
  4. tar 解压 跳过第一级目录
  5. 机器学习之路(一元线性回归)
  6. NVIDIA DPU — 安装部署
  7. 年度第一首发。阿里Java顶级架构师面试标准手册对标P8,牛×啊
  8. Galera Cluster for MySQL 详解(二)——安装配置
  9. html无缝滚动原理,Html5移动端获奖无缝滚动动画实现
  10. 有意思!细长件物料的自动搬运机器人/AGV