`
touchmm
  • 浏览: 1043405 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

彩色图像分割的FLOOD FILL方法(源代码)

阅读更多

下面是OPENCV B4.0 附带的 FLOOD FILL 算法的源代码样例,可以实现简单的彩色图像分割。

#ifdef _CH_
#pragma package <opencv>
#endif

#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <stdlib.h>
#endif

IplImage* color_img0;
IplImage* mask;
IplImage* color_img;
IplImage* gray_img0 = NULL;
IplImage* gray_img = NULL;
int ffill_case = 1;
int lo_diff = 20, up_diff = 20;
int connectivity = 4;
int is_color = 1;
int is_mask = 0;
int new_mask_val = 255;

void on_mouse( int event, int x, int y, int flags )
{
if( !color_img )
return;

switch( event )
{
case CV_EVENT_LBUTTONDOWN:
{
CvPoint seed = cvPoint(x,y);
int lo = ffill_case == 0 ? 0 : lo_diff;
int up = ffill_case == 0 ? 0 : up_diff;
int flags = connectivity + (new_mask_val << 8) +
(ffill_case == 1 ? CV_FLOODFILL_FIXED_RANGE : 0);
int b = rand() & 255, g = rand() & 255, r = rand() & 255;
CvConnectedComp comp;

if( is_mask )
cvThreshold( mask, mask, 1, 128, CV_THRESH_BINARY );

if( is_color )
{
CvScalar color = CV_RGB( r, g, b );
cvFloodFill( color_img, seed, color, CV_RGB( lo, lo, lo ),
CV_RGB( up, up, up ), &comp, flags, is_mask ? mask : NULL );
cvShowImage( "image", color_img );
}
else
{
CvScalar brightness = cvRealScalar((r*2 + g*7 + b + 5)/10);
cvFloodFill( gray_img, seed, brightness, cvRealScalar(lo),
cvRealScalar(up), &comp, flags, is_mask ? mask : NULL );
cvShowImage( "image", gray_img );
}

printf("%g pixels were repainted\n", comp.area );

if( is_mask )
cvShowImage( "mask", mask );
}
break;
}
}

int main( int argc, char** argv )
{
char* filename = argc >= 2 ? argv[1] : (char*)"fruits.jpg";

if( (color_img0 = cvLoadImage(filename,1)) == 0 )
return 0;

printf( "Hot keys: \n"
"\tESC - quit the program\n"
"\tc - switch color/grayscale mode\n"
"\tm - switch mask mode\n"
"\tr - restore the original image\n"
"\ts - use null-range floodfill\n"
"\tf - use gradient floodfill with fixed(absolute) range\n"
"\tg - use gradient floodfill with floating(relative) range\n"
"\t4 - use 4-connectivity mode\n"
"\t8 - use 8-connectivity mode\n" );

color_img = cvCloneImage( color_img0 );
gray_img0 = cvCreateImage( cvSize(color_img->width, color_img->height), 8, 1 );
cvCvtColor( color_img, gray_img0, CV_BGR2GRAY );
gray_img = cvCloneImage( gray_img0 );
mask = cvCreateImage( cvSize(color_img->width + 2, color_img->height + 2), 8, 1 );

cvNamedWindow( "image", 0 );
cvCreateTrackbar( "lo_diff", "image", &lo_diff, 255, NULL );
cvCreateTrackbar( "up_diff", "image", &up_diff, 255, NULL );

cvSetMouseCallback( "image", on_mouse );

for(;;)
{
int c;

if( is_color )
cvShowImage( "image", color_img );
else
cvShowImage( "image", gray_img );

c = cvWaitKey(0);
switch( c )
{
case '\x1b':
printf("Exiting ...\n");
goto exit_main;
case 'c':
if( is_color )
{
printf("Grayscale mode is set\n");
cvCvtColor( color_img, gray_img, CV_BGR2GRAY );
is_color = 0;
}
else
{
printf("Color mode is set\n");
cvCopy( color_img0, color_img, NULL );
cvZero( mask );
is_color = 1;
}
break;
case 'm':
if( is_mask )
{
cvDestroyWindow( "mask" );
is_mask = 0;
}
else
{
cvNamedWindow( "mask", 0 );
cvZero( mask );
cvShowImage( "mask", mask );
is_mask = 1;
}
break;
case 'r':
printf("Original image is restored\n");
cvCopy( color_img0, color_img, NULL );
cvCopy( gray_img0, gray_img, NULL );
cvZero( mask );
break;
case 's':
printf("Simple floodfill mode is set\n");
ffill_case = 0;
break;
case 'f':
printf("Fixed Range floodfill mode is set\n");
ffill_case = 1;
break;
case 'g':
printf("Gradient (floating range) floodfill mode is set\n");
ffill_case = 2;
break;
case '4':
printf("4-connectivity mode is set\n");
connectivity = 4;
break;
case '8':
printf("8-connectivity mode is set\n");
connectivity = 8;
break;
}
}

exit_main:

cvDestroyWindow( "test" );
cvReleaseImage( &gray_img );
cvReleaseImage( &gray_img0 );
cvReleaseImage( &color_img );
cvReleaseImage( &color_img0 );
cvReleaseImage( &mask );

return 1;
}

#ifdef _EiC
main(1,"ffilldemo.c");
#endif

<!-- Signature -->
分享到:
评论

相关推荐

    彩色图像分割的FLOOD FILL方法(源代码).rar_OpenCV 分割_opencv 图像分割_opencv图像分割_图像

    在给出的源代码文件"彩色图像分割的FLOOD FILL方法(源代码).mht"中,开发者可能展示了如何使用OpenCV的`floodFill()`函数进行图像分割。源代码会演示如何选择种子点,设置新的填充颜色,以及控制填充范围。通过调试...

    Flood_Fill算法

    Flood Fill 算法 Flood Fill 算法是一种...Flood Fill 算法的应用非常广泛,可以用来解决许多实际问题,例如图像处理、网络拓扑结构分析等等。该算法的优点是可以快速地寻找极大连通子图,缺点是需要占用较多的空间。

    SYN flood C源代码

    SYN flood是属于DOS攻击的一种典型方式,其发生方式就出现在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手...

    图像分割中的分水岭算法

    在众多图像分割方法中,分水岭算法是一种非常重要的技术,尤其适用于处理具有复杂边缘和区域的图像。 分水岭算法起源于地理学中的地形分析,它将图像视为地形,每个像素的高度表示其灰度值。在图像中,低灰度值区域...

    iOS flood fill 算法

    通过分析源代码,我们可以更深入地了解如何在Cocos2d-x环境中实现Flood Fill算法,并将其应用于实际的iOS应用中。 总的来说,Flood Fill算法在iOS开发中具有广泛的应用,而Objective-C的实现则需要熟悉Core ...

    C#,计算几何,计算机图形学(Computer Graphics)洪水填充算法(Flood Fill Algorithm)与源代

    C#,计算几何,计算机图形学(Computer Graphics)洪水填充算法(Flood Fill Algorithm)与源代码 泛洪填充算法(Flood Fill Algorithm) ,又称洪水填充算法,是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 ...

    SYN Flood攻击源程序

    Microsoft Visual C++ 6.0环境下的syn flood源程序

    udp flood攻击【C源代码】

    这个udpFlood是从上面我写的那个synflood里改的,很简单,如果大家需要做两个攻击的话建议自己改一个就ok,也可以集成在一起。还能多练习,熟悉tcp和udp的区别

    Python库 | flood_fill_filter-1.1.0-py3-none-any.whl

    在实际应用中,`flood_fill_filter`可能被用于图像分析项目,例如分割图像以识别特定对象,或者在游戏开发中用于碰撞检测和区域填充。此外,它还可以与OpenCV、PIL等其他图像处理库结合使用,增强图像处理能力。 ...

    java-leetcode题解之Flood Fill.java

    java java_leetcode题解之Flood Fill.java

    C++-leetcode题解之733. Flood Fill.cpp

    c++ C++_leetcode题解之733. Flood Fill.cpp

    图像分割数据集:水灾语义分割(2类别)【数据集+标签文件+数据可视化代码】

    项目包含:洪水水灾语义分割(2类别)【数据集+标签文件+数据可视化代码】 图像分辨率为:640*640 数据格式:jpg mask标签格式:png 数据集为水灾灾害分割,对洪水进行语义分割,分割的mask模版为0 1的阈值图像。...

    细胞等阈值分割后100%还原图像填充法

    - **填充原理**:通过扩展图像边界并使用洪水填充算法(flood fill)填充背景区域,然后与原始二值图像进行逻辑运算,以消除内部孔洞。 - **洪水填充**:这是一种常用的填充算法,可以用于快速填充连通的相同或...

    Flood-inundation-risk-analysis.rar_SWAT_ae_flood fill _淹没_淹没分析

    "SWAT_ae_flood_fill_淹没_淹没分析"这部分是该压缩包内的一个项目或工具,可能是一个基于SWAT(Soil and Water Assessment Tool)模型和ArcGIS Extension(AE)的洪水淹没模拟与分析系统。SWAT是一种广泛应用的流域...

    C++OpenCV3源代码漫水填充算法

    在计算机视觉中,漫水填充算法常被用来分割图像、去除噪点等。 从标题《C++ OpenCV3源代码漫水填充算法》可以推断出,本文或提供的资料中包含了利用C++编程语言结合OpenCV3库实现漫水填充算法的源代码。这个源代码...

    分水岭分割算法

    - **填充过程**:从标记点开始,使用Dijkstra算法或Flood Fill等方法逐像素填充,形成“湖泊”。 - **分水岭线确定**:当两个“湖泊”相遇时,其交界线就是分水岭线,即分割边界。 - **后处理**:处理可能出现的过度...

    Android代码-open_flood

    A flood fill game for Android by GunshipPenguin (Rhys RE). Gameplay You start in the upper left hand corner of the board. Tap the colored buttons along the bottom of the board to flood all ...

    基于半监督学习的Sentinel-1 SAR图像洪水分割_Flood Segmentation on Sentinel-1 SA

    在洪水灾害频发的背景下,基于半监督学习的Sentinel-1合成孔径雷达(SAR)图像洪水分割技术显得尤为重要。Sentinel-1 SAR图像能够提供全天候、全时段的遥感信息,尤其适用于洪水监测。传统的监督学习方法依赖大量...

    SYN flood攻击

    在提供的压缩包中,`SYN.cpp`可能是实现SYN Flood攻击检测或防御的C++源代码文件,它可能会包含使用WinPcap库来捕获和分析网络封包的代码。`packet.h`可能是包含封包处理相关函数和结构体定义的头文件,提供了与封包...

    FloodFillOPenCV:使用 OpenCV 框架在IOS 平台实现的Flood Fill 功能

    在计算机视觉领域,填充算法(如Flood Fill)是图像处理中的重要技术之一。本文将深入探讨如何在iOS平台上利用OpenCV框架实现FloodFill功能,同时也会涉及到C++编程语言的应用。 OpenCV,全称Open Source Computer ...

Global site tag (gtag.js) - Google Analytics