[转]根据边界填充联通域

使用OpenCV提取的contour

void CFreeExtract::PaintCC(CvSeq* contour, IplImage* imgCC,int nTop, int nLeft)
{
// 1. paint as black
cvZero(imgCC);

// 2. paint contour as white
for( int i = 0; i < contour->total; i++ )
{
   CvPoint* line = (CvPoint*)cvGetSeqElem(contour,i); //just a pointer!
   int w = line->x-nLeft+1;
   int h = line->y-nTop+1;

   imgCC->imageData[h*imgCC->widthStep+w] = 255;
}

// 3. fill outer space as white
cvFloodFill(imgCC,cvPoint(0,0),cvScalar(255));

// 4. paint contour as black
for( int i = 0; i < contour->total; i++ )
{
   CvPoint* line = (CvPoint*)cvGetSeqElem(contour,i); //just a pointer!
   int w = line->x-nLeft+1;
   int h = line->y-nTop+1;

   imgCC->imageData[h*imgCC->widthStep+w] = 0;
}

// 5. revert image
for (int h=0;h<imgCC->height;h++)
{
   for (int w=0;w<imgCC->width;w++)
   {
    int v = (int)(unsigned char)imgCC->imageData[h*imgCC->widthStep+w];
    if (v==255)
     imgCC->imageData[h*imgCC->widthStep+w] = 0;
    else
     imgCC->imageData[h*imgCC->widthStep+w]=255;
   }
}

// 6.paint inner contour
IplImage* imgInner = cvCloneImage(imgCC);
CvSeq* contourInner = contour->v_next;
for( ; contourInner != 0; contourInner = contourInner->h_next )
{
   // 6.1 draw inner contour as white
   cvZero(imgInner);
   for( int i = 0; i < contourInner->total; i++ )
   {
    CvPoint* line = (CvPoint*)cvGetSeqElem(contourInner,i); //just a pointer!
    int h = line->y-nTop+1;
    int w = line->x-nLeft+1;
    imgInner->imageData[h*imgInner->widthStep+w] = 255;
   }

   // 4.2 flood background as white
   cvFloodFill( imgInner, cvPoint(0,0), cvScalar(255));   // 255~back


   // 4.4 erase holes in m_pbPix
   for (int h=0;h<imgInner->height;h++)
   {
    for (int w=0;w<imgInner->width;w++)
    {
     if ((int)(unsigned char)(imgInner->imageData[h*imgInner->widthStep+w]) == 0)
      imgCC->imageData[h*imgCC->widthStep+w] = 0;
    }
   }
  
}
cvReleaseImage(&imgInner);

}

 
这个是完整源码 python实现 Django 【python毕业设计】基于Python的天气预报(天气预测分析)(Django+sklearn机器学习+selenium爬虫)可视化系统.zip 源码+论文+sql脚本 完整版 数据库是mysql 本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后,将其存储在后端数据库中,以供后续分析。 其次,采用s,将其存储在后端数据库中,以供后续分析。 其次,采用sklearn机器学习库构建预测模型,通过时间序列分析和回归方法,对未来天气情况进行预测。我们利用以往的数据训练模型,以提高预测的准确性。通过交叉验证和超参数优化等技术手段,我们优化了模型性能,确保其在实际应用中的有效性和可靠性。 最后,基于Django框架开发前端展示系统,实现天气预报的可视化。用户可以通过友好的界面查询实时天气信息和未来几天内的天气预测。系统还提供多种图表类型,包括折线图和柱状图,帮助用户直观理解天气变化趋势。 本研究的成果为天气预报领域提供了一种新的技术解决方案,不仅增强了数据获取和处理的效率,还提升了用户体验。未来,该系统能够扩展至其他气象相关的应用场景,为大众提供更加准确和及时的气象服务。
<think>嗯,用户想了解如何使用OpenCV的种子填充算法(Seed Fill)来合并图像中的连通域。首先,我需要回忆一下种子填充算法的基本原理。种子填充通常用于区域填充,从给定的种子点开始,向四周扩散,直到满足停止条件。这在计算机图形学中常用于填充封闭区域。 然后,我需要考虑OpenCV中是否有现成的函数来实现这个功能。比如,我知道OpenCV有floodFill函数,它应该能实现类似种子填充的效果。这个函数可以修改图像,填充连通区域,同时可以设置掩膜和填充颜色。可能需要结合循环,遍历图像中的每个像素,当遇到未访问过的前景点时,作为种子进行填充,并标记已访问的区域。 不过,用户提到的是合并连通域,可能需要将不同的连通区域合并成一个。这时候可能需要先找到所有的连通区域,然后通过某种方式将它们合并。或者,可能用户是指将相邻的连通域合并,比如通过膨胀操作后再进行填充,使得原本分离的区域连接起来。需要确认具体的需求。 接下来,示例代码的结构应该包括读取图像,二值化处理,然后应用种子填充。需要注意处理多个连通域的情况,可能需要为每个区域分配不同的标签或颜色。同时,要处理边界问题,避免越界访问。 另外,可能要考虑性能问题,种子填充算法在大的图像上可能会比较慢,特别是递归实现的话。OpenCV的floodFill可能已经优化过,所以应该优先使用内置函数。同时,掩膜的使用可以帮助限制填充区域,提高效率。 用户可能还需要了解如何在实际应用中使用这种方法,比如在图像分割或对象检测中合并相邻的区域。可能需要结合形态学操作,如膨胀或腐蚀,来预处理图像,使得连通域更容易合并。 最后,要确保代码正确,语法无误,并且注释清晰,方便用户理解每一步的作用。同时,需要验证示例代码是否真的能达到合并连通域的效果,可能需要测试不同的图像情况,比如多个分离的区域经过处理后是否被正确合并。</think>要使用OpenCV的种子填充算法合并连通域,可以通过以下步骤实现: ### 实现步骤 1. **二值化预处理**:将图像换为二值图像以分离前景和背景 2. **标记已访问区域**:创建与原图同尺寸的掩膜矩阵记录填充状态 3. **遍历像素点**:逐像素扫描,发现未标记的前景点时触发种子填充 4. **泛洪填充**:使用`floodFill()`向四邻域/八邻域扩散,标记相同连通域 5. **区域合并**:通过形态学操作预处理可合并相邻区域 ```python import cv2 import numpy as np def merge_connected_areas(img_path): # 读取并二值化图像 img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) _, bin_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 创建掩膜并初始化 h, w = bin_img.shape mask = np.zeros((h+2, w+2), np.uint8) # 需要+2边界 # 合并处理后的图像 result = bin_img.copy() # 遍历所有像素 for y in range(h): for x in range(w): if mask[y+1, x+1] == 0 and bin_img[y, x] == 255: # 执行泛洪填充,修改填充颜色可区分不同区域 cv2.floodFill(result, mask, (x,y), 255, loDiff=(5,)*3, upDiff=(5,)*3, flags=4|(255 << 8)|cv2.FLOODFILL_MASK_ONLY) return result # 使用示例 merged = merge_connected_areas("input.png") cv2.imwrite("merged_result.png", merged) ``` ### 关键参数说明 1. `loDiff/upDiff`:控制颜色/亮度差异的容忍度 2. `flags=4`:4邻域填充(8邻域使用8) 3. `FLOODFILL_MASK_ONLY`:仅修改掩膜不修改原图[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值