亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? segimage.cpp

?? matlab一些常用的處理模塊
?? CPP
字號:
/****************************************************************************** * 光學字符識別程序 * 文件名:page.h * 功能  :圖像分割實現 * modified by PRTsinghua@hotmail.com******************************************************************************/#include <math.h>#include <iostream>#include <string>#include "common_math.h"#include "segimage.h"using std::cout;using std::endl;// 設置相反點void Segimage::point::set_opposite( ringlist_iterator<point> opposite ){	opp = opposite;	length = euklidian_distance( x, y, opp->x, opp->y );}// 返回直線bool Segimage::cs_sequence_start::get_straight_line( float &x1, float &y1, float &x2, float &y2 ){	if( sequence->front() == sequence->back() )		return false;			list<point *>::iterator i = is_start ? sequence->begin() : --sequence->end();	x1 =( (*i)->x + (*i)->opp->x ) / 2.0;	y1 =( (*i)->y + (*i)->opp->y ) / 2.0;		is_start ? ++i : --i;	x2 =( (*i)->x + (*i)->opp->x ) / 2.0;	y2 =( (*i)->y + (*i)->opp->y ) / 2.0;		return true;}// 清空void Segimage::clear(){	for( int i = 0; i < size_x; i++ )		seg_img[i].resize( size_y );	for ( int y = 0; y<size_y; y++ )		for ( int x = 0; x < size_x; x++ )		{			pixel &p = get_pixel( x, y );			p.is_border = false;			p.is_filled = false;			p.processed = 0;			p.segment = 0;		}	cs_total_length = 0;	cs_number = 0;	min_x=min_y = INT_MAX;	max_x=max_y = INT_MIN;	outer_pixel.is_border = false;	outer_pixel.is_filled = false;	outer_pixel.processed = 0;	outer_pixel.segment = 2;}// 構造函數Segimage::Segimage( int x, int y ) : size_x( x ), size_y( y ), seg_img( x ){	clear();}// 構造函數Segimage::Segimage( const CharImage& img ) : size_x( img.width() ), size_y( img.height() ), seg_img( size_x ){	clear();		for ( int y = 0; y < size_y; y++ )		for ( int x = 0; x < size_x; x++ )			if( img.get_bw_pixel( x, y ) )				if( !( seg_img[x][y].is_border = img.is_border_pixel( x, y ) ) )					seg_img[x][y].segment = 1;}// 填充void Segimage::fill( int x, int y, pixel &p, int segnr ){	assert( p != outer_pixel );	pixel &me = get_pixel( x, y );	if( me != p )		return;			me.segment = segnr;	fill( x-1, y,   p, segnr );	fill( x,   y+1, p, segnr );	fill( x+1, y,   p, segnr );	fill( x,   y-1, p, segnr );}// 檢測分段int Segimage::detect_segments(){	pixel pix;	pix.is_border = false;	pix.is_filled = false;	pix.processed = 0;	pix.segment = 0;		// 填充所有背景點	for (int y = 0; y < size_y; y++ )	{		if( y == 0 || y == size_y-1 )			for ( int x = 0; x < size_x; x++ )				fill( x, y, pix, 2 );		else		{			fill( 0, y, pix, 2);			fill( size_x - 1, y, pix, 2);		}	}		// 填充內部分段	int segnr = 3;	for (int y = 0; y < size_y; y++ )		for ( int x = 0; x < size_x; x++ )			if( get_pixel( x, y ) == pix )				fill( x, y, pix, segnr++ );		for ( int y = 0; y < size_y; y++ )		for ( int x = 0; x < size_x; x++ )		{			pixel &p = get_pixel( x, y );			if( p.is_border )			{				unsigned int tmp = p.segment;				set_segment( x-1, y,   tmp);				set_segment( x,   y-1, tmp);				set_segment( x+1, y,   tmp);				set_segment( x,   y+1, tmp);				p.segment = tmp;			}		}	return segnr - 1;}// 獲得邊界列表void Segimage::get_border_lists( Segimage::border_lists &l ){	int num_segs = detect_segments();	// 奇怪的字符	if ( num_segs > max_segment )		return;		l.resize( num_segs - 1 );		// 備用內存	for( vector< vector< qlist< point > > >::iterator i = l.begin(); i != l.end(); i++ )		i->reserve( vector_def_reserve );	for ( int y = 0; y < size_y; y++ )		for ( int x = 0; x < size_x; x++ )		{			pixel &p = get_pixel( x, y );			if( p.is_border && p.segment != p.processed ) // 邊界點,且未進行分段處理			{				for(int i = 0; i < num_segs; i++ )				{					if( ( p.segment & ( 1 << i ) ) && !( p.processed & ( 1 << i ) ) )					{						vector< qlist< point > > &v = l[i];						v.resize( v.size()+1 );						SegWalker walker( this );						walker.walk_border( x, y, i, &v.back() );					}				}			}		}		for( vector< vector< qlist<point> > >::iterator i = l.begin(); i!=l.end(); ++i )	{		for( vector< qlist<point> >::iterator n = i->begin(); n!=i->end(); ++n )		{			ringlist_iterator< Segimage::point > m(*n);			for( int o = n->size(); o > 0; ++m, o-- )			{				if ( m->x < min_x)					min_x = m->x;				if ( m->y < min_y)					min_y = m->y;				if ( m->x > max_x)					max_x = m->x;				if ( m->y > max_y)					max_y = m->y;				pixel &pix = get_pixel( m->x, m->y );				pix.border_points.push_back(m);			}		}	}}// 打印void Segimage::print( int mark_x, int mark_y ){	for ( int y = 0; y < size_y; y++ )	{		for ( int x = 0; x < size_x; x++ )		{			if( x == mark_x && y == mark_y )				cout << "\033[34m\033[7m*";						else			{				if( get_pixel( x, y ).is_filled )					cout << "\033[34m\033[7m#";								else if ( get_pixel( x, y ).segment == 9 )					cout << "\033[32m\033[7m*";								else if ( get_pixel(x,y).is_border )					cout << "\033[31m\033[7m" << get_pixel( x, y ).segment;								else					cout << "\033[30m\033[0m" << get_pixel( x, y ).segment;			}		}		cout << "\033[30m\033[0m" << endl;	}	cout << endl;}// 平均線條粗細double Segimage::avg_line_thickness(){	if ( cs_number )		return cs_total_length / cs_number;	else		return 0;}// Bresenham算法畫線void Segimage::lineBresenham( int x0, int y0, int x1, int y1, HandlePixelCallback cb, void *cb_data ){	int dy = y1 - y0;	int dx = x1 - x0;	int stepx, stepy;	if ( dy < 0 )		// 起點不是最低點	{		dy = -dy;		stepy = -1;	}	else		stepy = 1;	if ( dx < 0 )		// 起點不是最左點	{		dx = -dx;		stepx = -1;	}	else		stepx = 1;	dy *= 2;	dx *= 2;	if( !( (this->*cb )( x0, y0, cb_data ) ) )		return;		if ( dx > dy )	// slopes < 1	{		int decision = 2*dy - dx;		// 初始決策變量				while ( x0 != x1 )		{			if ( decision <= 0 )			{				x0 += stepx;				decision += dy;			// 更新決策變量			}			else			{				x0 += stepx;				y0 += stepy;				decision += dy - dx;	// 更新決策變量			}						if( !( ( this->*cb )( x0, y0, cb_data ) ) )				return;		}	}	else	{		int decision = 2*dx - dy;		// 初始決策變量				while ( y0 != y1 )		{			if ( decision <= 0 )			{				y0 += stepy;				decision += dx;			// 更新決策變量			}			else			{				x0 += stepx;				y0 += stepy;				decision += dx - dy;	// 更新決策變量			}						if( !( ( this->*cb )( x0, y0, cb_data ) ) )				return;		}	}}// Bresenham算法畫線void Segimage::lineBresenham(int x0, int y0, float angle, HandlePixelCallback cb, void *cb_data){	const int h = size_x+size_y;	lineBresenham( x0, y0,		static_cast< int >( x0 + h*cos( angle ) ),		static_cast< int >( y0 + h*sin( -angle ) ),		cb, cb_data );}// Bresenham算法畫線void Segimage::lineBresenham(int x0, int y0, int x1, int y1){	lineBresenham( x0, y0, x1, y1, &Segimage::draw_pixel, NULL );}// 尋找對立點bool Segimage::find_opposite_pixel(int x0, int y0, void *cb_data){	bool result = true;	opposite_data &od = *reinterpret_cast< opposite_data * >( cb_data );	if( od.first )		od.first = false;	else	{		pixel &pix = get_pixel( x0, y0 );		if( pix.is_border || pix.segment != 1 )			result = false;	}		if( result )	{		od.ax = x0;		od.ay = y0;	}	else	{		od.ex = x0;		od.ey = y0;	}	return result;}// 通過畫線尋找對立點ringlist_iterator<Segimage::point> &Segimage::find_opposite( const Segimage::point &p ){	opposite_data od;	od.first = true;	int rx;	int ry;	lineBresenham( p.x, p.y, p.ang, &Segimage::find_opposite_pixel, &od );	pixel pix=get_pixel( od.ex, od.ey );	if( pix.is_border )		{		rx = od.ex;		ry = od.ey;	}	else if( od.ax == p.x && od.ay == p.y )	{		rx = p.x;		ry = p.y;	}	else	{		int delta_x = od.ax - od.ex;		int delta_y = od.ay - od.ey;		int x_diag_1 = od.ex + delta_x;		int y_diag_1 = od.ey;		int x_diag_2 = od.ex;		int y_diag_2 = od.ey + delta_y;		float angle_1 = atan2( y_diag_1 - p.y, x_diag_1 - p.x );		float angle_2 = atan2( y_diag_2 - p.y, x_diag_2 - p.x );		if ( fabs( p.ang - angle_1 ) < fabs( p.ang - angle_2 ) )		{			rx = x_diag_1;			ry = y_diag_1;		}		else		{			rx = x_diag_2;			ry = y_diag_2;	       		}	}		pixel &rpix = get_pixel( rx, ry );	ringlist_iterator< point > *r = NULL;	float ang = 2*M_PI;		assert( rpix.is_border );	float angle = normalize_angle_pi( p.ang + M_PI );	for( list< ringlist_iterator<point> >::iterator i = rpix.border_points.begin(); i != rpix.border_points.end(); ++i )	{		assert( (*i)->x == rx && (*i)->y == ry );		float new_angle = min_angle_between((*i)->ang,angle,2*M_PI);		if( new_angle < ang )		{			ang = new_angle;			r = &(*i);		}	}	assert( r != NULL );	return *r;}// 計算交叉點bool Segimage::intersect_pixel( int x0, int y0, void *cb_data ){	pixel &pix = get_pixel( x0, y0 );	intersect_data &cb = *reinterpret_cast< intersect_data * >( cb_data );	point &p = *cb.p;	list< point * >::iterator i = pix.start_points.begin();		while( i != pix.start_points.end() )	{		if( (*i)->length == -1 ) // 線已經被標記刪除			i = pix.start_points.erase(i);		else		{			if( line_segment( (*i)->x, (*i)->y, (*i)->opp->x, (*i)->opp->y ).intersect( 				line_segment( p.x, p.y, p.opp->x, p.opp->y ), false) )			{				cs_number--; 				if( (*i)->length > p.length )	// 其它線更長,刪除				{					cs_total_length -= (*i)->length;					(*i)->length = -1;					(*i)->opp->num_ending--;					i = pix.start_points.erase(i);					continue;				}				else				// 當前線更長或相等,刪除				{					cs_total_length -= p.length;					p.length = -1;					return false;				}			}			++i;		}	}	int delta_x = x0 - cb.ax;	int delta_y = y0 - cb.ay;	// 特例:對角線交叉	if( delta_x && delta_y )	{		int x_diag_1 = x0-delta_x;		int y_diag_1 = y0;		int x_diag_2 = x0;		int y_diag_2 = y0-delta_y;		pixel &pd1 = get_pixel( x_diag_1, y_diag_1 );		pixel &pd2 = get_pixel( x_diag_2, y_diag_2 );		i=pd1.start_points.begin();		// 校驗所有的對角線交叉		while( i != pd1.start_points.end() )		{			if( (*i)->length == -1 ) 				i = pd1.start_points.erase(i);			else			{				list< point * >::iterator j = pd2.start_points.begin();				while( j != pd2.start_points.end() )				{					if( (*j)->length==-1 ) 						j = pd2.start_points.erase(j);					else					{						if( *i == *j )						{							cs_number--;							if( (*i)->length > p.length )							{								cs_total_length -= (*i)->length;								(*i)->length = -1;								(*i)->opp->num_ending--;								i = pd1.start_points.erase(i);								j = pd2.start_points.erase(j);								continue;							}							else							{								cs_total_length -= p.length;								p.length = -1;								return false;							}						}						++j;					}				}				++i;			}		}	}	pix.start_points.push_back( &p );	cb.ax = x0;	cb.ay = y0;	return true; }// 繪制交叉區段void Segimage::intersect_cs( Segimage::point &p ){	cs_total_length += p.length;	cs_number++;	intersect_data cb;	cb.ax = p.x;	cb.ay = p.y;	cb.p = &p;	lineBresenham( p.x, p.y, p.opp->x, p.opp->y, &Segimage::intersect_pixel, &cb );}// 繪制孤立點bool Segimage::draw_singular_pixel( int x0, int y0, void *p ){	fill_singular_region( x0, y0, reinterpret_cast< point * >( p ) );	return true;}// 區域填充void Segimage::fill_region( Segimage::point *sp ){	lineBresenham( sp->x, sp->y, sp->opp->x, sp->opp->y, &Segimage::draw_singular_pixel, sp );}// 捕獲區段bool Segimage::take_over_segment( int x, int y, Segimage::singularpoint &sp ){	pixel &p = get_pixel( x, y );	if( p.is_filled )		return p.start_points.empty();	else	{		if( p.segment == 1 || p.is_border )		{			list< point * >::iterator i = p.start_points.begin();			while( i != p.start_points.end() )			{				if( ( *i )->length == -1 )					i = p.start_points.erase( i );				else					return false;			}			p.is_filled = true;			sp.x += x;			sp.y += y;			sp.pix_count++;			return take_over_segment( x-1, y,   sp) &&			       take_over_segment( x,   y+1, sp) &&			       take_over_segment( x+1, y,   sp) &&			       take_over_segment( x,   y-1, sp);		}	}	return true;}// 取消捕獲區段操作void Segimage::undo_take_over_segment( int x, int y ){	pixel &p = get_pixel( x, y );	if( p.is_filled && p.start_points.empty() )	{		p.is_filled = false;		undo_take_over_segment( x-1, y);		undo_take_over_segment( x,   y+1);		undo_take_over_segment( x+1, y);		undo_take_over_segment( x,   y-1);	}}// 填充孤立區域void Segimage::fill_singular_region( int x, int y, Segimage::point *start_point ){	pixel &p = get_pixel( x, y );	if( p.is_filled )	{		singularpoint *ssp = start_point->singular_point, 			      *psp = p.start_points.front()->singular_point;		if( ssp != psp )		{			if( psp->pix_count != 0 )			{				if( ssp->pix_count == 0 )				{					ssp->x = psp->x;					ssp->y = psp->y;				}				else				{					ssp->x += psp->x;					ssp->y += psp->y;				}				ssp->pix_count += psp->pix_count;							}			for( list<cs_sequence_start>::iterator i = psp->cs_sequences.begin(); i != psp->cs_sequences.end(); ++i )			{				ssp->cs_sequences.push_back( *i );				point &start_point = *( i->is_start ? i->sequence->front() : i->sequence->back() );				start_point.singular_point = ssp;			}			psp->cs_sequences.clear();		}	}	else 	{		if( p.segment == 1 || p.is_border )		{			bool our_cs = false;			int nr = 0;			list< point * >::iterator i = p.start_points.begin();						while( i != p.start_points.end() )			{				if( (*i)->length == -1 )			// 行標志擦除					i = p.start_points.erase( i );				else				{					if( *i == start_point )						our_cs = true;					++nr;					++i;									}			}						if( p.start_points.empty() || ( our_cs && nr == 1 ) )			{				p.is_filled = true;				singularpoint &sp = *( start_point->singular_point );								if( sp.pix_count == 0 )				{					sp.x = x;					sp.y = y;				}				else				{					sp.x += x;					sp.y += y;				}				sp.pix_count++;				p.start_points.clear();				p.start_points.push_back( start_point );								fill_singular_region( x-1, y,   start_point );				fill_singular_region( x,   y+1, start_point );				fill_singular_region( x+1, y,   start_point );				fill_singular_region( x,   y-1, start_point );			}		}	}}// 遍歷邊界點void SegWalker::walk_border( int start_x, int start_y, int seg, qlist<Segimage::point> *l ){	segment = seg;	list = l;	Walker::walk_border( start_x, start_y );}// 判斷是否一個好的遍歷起點bool SegWalker::is_good_walker_start( int x, int y ) const{	Segimage::pixel &pix = img->get_pixel( x, y );	return ( !pix.is_border && pix.segment == ( segment + 2 ) );}// 遍歷過程void SegWalker::walker_process( int x, int y ){	list->push_back( Segimage::point( x, y ) );	Segimage::pixel &pix = img->get_pixel( x, y );	pix.processed = pix.processed | ( 1 << segment );}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色一区在线观看| 一区二区三区欧美视频| 九九**精品视频免费播放| 884aa四虎影成人精品一区| 亚洲午夜精品17c| 欧美亚洲高清一区| 亚洲午夜电影在线| 日韩三级在线观看| 精品在线一区二区三区| 国产欧美精品一区| av中文一区二区三区| 亚洲精品第一国产综合野| 在线亚洲一区二区| 日韩av在线发布| 欧美电影免费提供在线观看| 国产精品12区| 亚洲免费视频成人| 欧美日韩国产另类一区| 久久99久久99| 国产精品久久久久久久久快鸭| 色综合咪咪久久| 肉色丝袜一区二区| 国产偷国产偷精品高清尤物| 99精品国产99久久久久久白柏| 一区二区三区久久| 日韩一区二区免费在线电影| 成人夜色视频网站在线观看| 一区二区三区中文字幕| 日韩一区二区在线观看视频播放 | 日本欧美一区二区三区| 久久久电影一区二区三区| 成人黄色一级视频| 首页国产欧美久久| 日本一区二区成人| 6080午夜不卡| 99久久99久久综合| 麻豆一区二区99久久久久| 亚洲欧美激情小说另类| 欧美成人a∨高清免费观看| 97se狠狠狠综合亚洲狠狠| 日韩av一区二区在线影视| 综合电影一区二区三区| 日韩欧美一级二级三级久久久| 99热99精品| 久久97超碰国产精品超碰| 亚洲人成亚洲人成在线观看图片| 日韩欧美一级在线播放| 欧美偷拍一区二区| 粉嫩久久99精品久久久久久夜| 日本在线不卡视频一二三区| 国产精品初高中害羞小美女文| 91精品国产色综合久久不卡电影| 成人综合在线观看| 久久99国产精品成人| 性做久久久久久免费观看| 欧美极品另类videosde| 久久影院午夜论| 日韩欧美国产一区二区在线播放| 欧美在线免费视屏| 成人深夜福利app| 国产老妇另类xxxxx| 日韩av一级电影| 悠悠色在线精品| 国产精品卡一卡二| 国产亚洲va综合人人澡精品| 日韩欧美一级二级三级久久久| 欧美日韩国产成人在线91| 一本大道久久a久久综合| 国产精品亚洲一区二区三区在线| 久久精品国产免费看久久精品| 亚洲图片欧美一区| 亚洲综合清纯丝袜自拍| 一区二区三区在线视频播放 | 亚洲情趣在线观看| 国产精品不卡视频| 中文字幕第一区二区| 久久久精品免费免费| 精品久久国产老人久久综合| 精品久久久久久久久久久院品网 | 欧美一区二区在线播放| 欧美视频在线一区| 欧美色倩网站大全免费| 欧美揉bbbbb揉bbbbb| 欧美日韩一区二区三区在线 | 日韩午夜小视频| 4438x亚洲最大成人网| 91精选在线观看| 欧美一区二区在线视频| 91精品国产综合久久精品| 日韩免费在线观看| 久久婷婷国产综合国色天香| 国产亚洲欧美一级| 国产精品美女久久福利网站| 亚洲欧美在线视频观看| 一区在线观看免费| 一区二区成人在线| 奇米精品一区二区三区在线观看 | 成人av电影在线| 91蝌蚪porny九色| 欧美日韩亚洲综合在线| 精品99一区二区| 国产精品视频一二| 亚洲一区二区三区四区在线观看| 亚洲va国产天堂va久久en| 三级欧美韩日大片在线看| 国产一区二区导航在线播放| 99re热这里只有精品视频| 欧美日韩视频在线观看一区二区三区 | 国产亚洲欧美日韩在线一区| 国产精品无人区| 欧美日韩国产精选| 久久久久久毛片| 欧美韩国一区二区| 亚洲女人小视频在线观看| 日日嗨av一区二区三区四区| 久久超碰97中文字幕| 国产精品一二三区| 波多野结衣一区二区三区| 色综合色狠狠天天综合色| 色老综合老女人久久久| 欧美日本视频在线| 日韩视频免费观看高清完整版 | 色婷婷亚洲婷婷| 欧美亚洲国产一区二区三区va| 欧美日产国产精品| 日韩欧美卡一卡二| 亚洲欧洲色图综合| 日韩影院在线观看| 国产专区综合网| 国产精品中文欧美| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美视频一区二区三区四区| 777亚洲妇女| 国产精品传媒视频| 日韩成人午夜精品| 福利一区二区在线观看| 欧美视频三区在线播放| 日韩欧美激情四射| 中文字幕国产一区| 久久电影网站中文字幕| 播五月开心婷婷综合| 7777精品久久久大香线蕉| 国产色产综合色产在线视频| 中文天堂在线一区| 狠狠网亚洲精品| 色综合天天综合色综合av| 欧美一区二区三区免费在线看| 中文字幕欧美国产| 日韩影院免费视频| 欧美精品高清视频| 亚洲国产精品传媒在线观看| 午夜成人免费电影| 成人av影视在线观看| 制服丝袜日韩国产| 中文字幕在线观看一区二区| 日日夜夜免费精品| 91麻豆福利精品推荐| 欧美精品一区二区三区高清aⅴ | 欧美日韩黄色一区二区| 国产精品欧美一区二区三区| 亚洲国产综合视频在线观看| av男人天堂一区| xnxx国产精品| 天天射综合影视| 91免费版在线| 国产网站一区二区三区| 国产成人免费在线视频| 91麻豆精品91久久久久久清纯| 亚洲美女淫视频| 国产成人免费视频| 欧美电影免费观看高清完整版在线观看| 亚洲国产一二三| 色激情天天射综合网| 中文字幕精品一区二区精品绿巨人 | 亚洲妇熟xx妇色黄| 欧美日韩国产区一| 亚洲精品中文在线影院| 成人短视频下载| 精品播放一区二区| 久久精品国产精品青草| 久久久久久久久久久久久久久99 | 中文字幕欧美一| 国产盗摄一区二区| 欧美色综合网站| 香蕉影视欧美成人| 欧美专区亚洲专区| 一区二区三区四区亚洲| 色综合天天综合色综合av| 亚洲午夜免费视频| 欧美中文字幕一区二区三区| 国产三级精品三级| 日本成人在线电影网| 一本色道综合亚洲| 亚洲午夜国产一区99re久久| 日韩欧美国产三级| 精品中文字幕一区二区| 久久久91精品国产一区二区精品 | 亚洲精品午夜久久久| 欧美喷潮久久久xxxxx| 婷婷成人综合网|