专业版源代码软件DIPA功能简介
与《实用图像处理与分析》配套的源代码软件DIPA是一套完全可执行的VC++界面源代码,界面内容除了图像的表示、读入、保存、彩色变灰度以外,还包括图像的2值化处理、微分变换、几何变换、彩色变换、参数测量、傅里叶变换、小波变换、Hough变换、模式识别、神经网络、遗传算法、图像压缩等功能,提供有近100个图像处理与分析函数的源代码。该软件主要适用于图像处理的教学和科研。与教材《实用图像处理与分析》配套使用时,教师可以边向学生传授理论,边讲解处理程序,然后示范处理结果,也可以以此为参照帮助学生调试练习中的程序错误。学生可以通过参考和复制来完成自己的编程练习。在科研上,研究者可以通过复制和改写图像处理的源程序,来完成自己的程序编写,可以节省大量的编程时间。该软件系统对图像处理编程的自学者也非常有用,学习图像处理编程,最好的办法是对现有程序进行修改、然后看看处理结果的变化,该软件系统给自学者提供了在实践中学习的平台。作为教学参考,在《实用图像处理与分析》的配套光盘里附录了该软件系统的演示版DIPA,该演示版只能演示处理教材上的图像,而且不能保存处理结果图像。
以下是该软件系统的部分界面和处理图:
1.初期画面
2.直方图表示
3.微分变换
4.彩色变换
5.图像合成
6.图像变换
7.傅立叶变换
原图及界面
频率图
频率通过域图
滤波后图像
8.小波变换
9.BP神经网络的文字识别
10.遗传算法的模式识别
提供的图像处理源代码函数一览表:
/--------------------------提取物体-----------------------------/
//一般2值化处理
void Threshold(BYTE image_in, BYTE image_out, int xsize, int ysize, int thresh, int mode);
// 双阈值2值化处理
void Threshold_mid(BYTE image_in, BYTE image_out, int xsize,
int ysize, int thresh_low, int thresh_high);
//反转图像
void Reverse_image(BYTE image_in, BYTE image_out, int xsize, int ysize);
//像素分布直方图
void Histgram(BYTE image, int xsize, int ysize, long hist[256]);
//计算直方图百分比
void CalHistPercent(long hist[], float hist_radio[], float &max_percent);
//直方图平滑化
void Hist_smooth(long hist_in[256], long hist_out[256]);
//直方图图像化(图像宽度大于等于64)
void Hist_to_image(long hist[256], BYTE image_hist, int xsize, int ysize);
/--------------------------提取轮廓-----------------------------/
//1阶微分边沿检出(梯度算子)
void Differential(BYTE image_in, BYTE image_out, int xsize, int ysize, float amp);
//2阶微分边沿检出(拉普拉斯算子)
void Differential2(BYTE image_in, BYTE image_out, int xsize, int ysize, float amp);
//Prewitt法边沿检出
void Prewitt(BYTE image_in, BYTE image_out, int xsize, int ysize, float amp);
//2值图像的细线化处理
void Thinning(BYTE image_in, BYTE image_out, int xsize, int ysize);
/--------------------------消除噪音-----------------------------/
//去噪音处理(移动平均)
void Image_smooth(BYTE image_in, BYTE image_out, int xsize, int ysize);
//去噪音处理(中值)
void Median(BYTE image_in, BYTE image_out, int xsize, int ysize);
//膨胀
void Dilation(BYTE image_in, BYTE image_out, int xsize, int ysize);
//腐蚀
void Erodible(BYTE image_in, BYTE image_out, int xsize, int ysize);
/--------------------------获取清晰图像------------------------/
//亮度n倍
void Brightness_amplify(BYTE image_in, BYTE image_out, int xsize, int ysize, float n);
//求亮度范围
void Brightness_range(BYTE image_in, int xsize, int ysize, int fmax, int fmin);
//亮度范围扩张
void Brightness_expand(BYTE image_in, BYTE image_out, int xsize, int ysize,
int fmax, int fmin);
//直方图平坦化
void Hist_plane(BYTE image_in, BYTE image_out, int xsize, int ysize, long hist[256]);
/--------------------------特征提取-----------------------------/
//区域标记
int Labeling(BYTE image_in, BYTE image_out, int xsize, int ysize, int cnt);
//测算特征数据
void Features(BYTE image_label_in, BYTE image_label_out, int xsize, int ysize,
int cnt, float size[], float length[], float ratio[], int center_x[], int center_y[]);
//抽出具有某圆形度的对象物
void Ratio_extract(BYTE image_label_in, BYTE image_label_out, int xsize, int ysize,
int cnt, float ratio[], float ratio_min, float ratio_max);
//抽出某面积范围的对象物
void Size_extract(BYTE image_label_in, BYTE image_label_out, int xsize, int ysize,
int cnt, float size[], float size_min, float size_max);
//复制模块领域的原图像
void Mask_copy(BYTE image_in, BYTE image_out, BYTE image_mask, int xsize, int ysize);
/--------------------------颜色变换-----------------------------/
//做彩条
void Colorbar(BYTE image_r, BYTE image_g, BYTE image_b,
int xsize, int ysize, int level);
//由R、G、B变换亮度、色差信号
void Rgb_to_yc(BYTE image_r, BYTE image_g, BYTE image_b,
int y, int c1, int c2, int xsize, int ysize);
//色差信号图像化
void Yc_to_image(int data, BYTE image, int xsize, int ysize);
//由亮度、色差变换R、G、B信号
void Yc_to_rgb(int y, int c1, int c2, BYTE image_r, BYTE image_g,
BYTE image_b, int xsize, int ysize);
//由色差信号计算彩度和色相
void C_to_SH(int c1, int c2, int sat, int hue, int xsize, int ysize);
//由彩度和色相计算色差信号
void SH_to_C(int sat, int hue, int c1, int c2, int xsize, int ysize);
//由彩度数据变换灰度图像
int Sat_to_image(int sat, BYTE image_out, int xsize, int ysize);
//由某点的RGB值计算计算彩度和色相
void Rgb_to_SH(BYTE r, BYTE g, BYTE b, double sat, double hue);
//由色相数据变换灰度图像
void Hue_to_image(int sat, int hue, double stdhue,
BYTE image_out, int xsize, int ysize);
//改变亮度、彩度和色相
void Change_YSH(int in_y, int in_sat, int in_hue, int out_y,
int out_sat, int out_hue, float ym, float sm, float hd, int xsize, int ysize);
/------------------------基于颜色的提取----------------------/
//计算2维直方图并图像化
void Hist2_image(BYTE image_in1, BYTE image_in2, BYTE image_hist, int xsize, int ysize);
//R,G,B的阈值处理
void Thresh_color(BYTE image_in_r, BYTE image_in_g, BYTE image_in_b,
BYTE image_out_r, BYTE image_out_g, BYTE image_out_b,
int thdrl, int thdrm, int thdgl, int thdgm, int thdbl, int thdbm,
int xsize, int ysize);
//生成硬合成键
void Hard_key(BYTE image_in_r, BYTE image_in_g, BYTE image_in_b,
BYTE image_key, int xsize, int ysize, int thresh);
//生成软合成键
void Soft_key(BYTE image_in_r, BYTE image_in_g, BYTE image_in_b,
BYTE image_key, int xsize, int ysize, int thdh, int thdl);
// 图像硬合成
void Synth(BYTE image_in1_r, BYTE image_in1_g, BYTE image_in1_b, BYTE image_in2_r, BYTE image_in2_g, BYTE image_in2_b, BYTE image_out_r, BYTE image_out_g, BYTE image_out_b, BYTE image_key, int xsize, int ysize);
//图像合成(消除境界线)
void S_synth(BYTE image_in1_r, BYTE image_in1_g, BYTE image_in1_b,
BYTE image_in2_r, BYTE image_in2_g, BYTE image_in2_b,
BYTE image_out_r, BYTE image_out_g, BYTE image_out_b,
BYTE image_key, int xsize, int ysize);
/--------------------------几何变换-----------------------------/
//错误的扩大缩小法
void Scale_NG(BYTE image_in, BYTE image_out, int xsize, int ysize, float zx, float zy);
//扩大、缩小(最近旁法)
void Scale_near(BYTE image_in, BYTE image_out, int xsize, int ysize, float zx, float zy);
//扩大、缩小(线性补间法)
void Scale(BYTE image_in, BYTE image_out, int xsize, int ysize, float zx, float zy);
//位移(线性补间法)
void Shift(BYTE image_in, BYTE image_out, int xsize, int ysize, float px, float py);
//回转(线性补间法)
void Rotation(BYTE image_in, BYTE image_out, int xsize, int ysize, float deg);
//仿射变换(移动、旋转、放大缩小)
void Affine(BYTE image_in, BYTE image_out, int xsize, int ysize, float deg,
float zx, float zy, float px, float py);
//透视变换(线性补间法)
void Perspective(BYTE image_in, BYTE image_out, int xsize, int ysize, float ax, float ay,
float px, float py, float pz, float rz,
float rx, float ry, float v, float s);
/-------------------Hough变换---------------------------------/
//一般hough变换
void Hough_general(BYTE image_in, BYTE image_out, int xsize, int ysize);
//过已知点hough变换
void Hough_d_point(BYTE image_in, BYTE image_out, int xsize, int ysize, int px, int py);
/---------------傅里叶变换程序---------------------------------/
//1次傅里叶变换
int FFT1(float a_rl[], float a_im[], int ex, int inv);
//1次傅里叶变换的主计算部分
void fft1core(float a_rl[], float a_im[], int length,
int ex, float sin_tbl[], float cos_tbl[], float buf[]);
//2次傅里叶变换
int FFT2 (float a_rl, float a_im, int inv, int xsize, int ysize);
//将2次FFT的变换结果频率域图像化
int FFTImage(BYTE image_in, BYTE image_out, int xsize, int ysize);
//2次FFT的滤波处理、滤波后的频率域图像化
int FFTFilter(BYTE image_in, BYTE image_out, int xsize, int ysize, int a, int b);
//图像的2次FFT变换、滤波处理、逆傅里叶变换
int FFTFilterImage(BYTE image_in, BYTE image_out, int xsize, int ysize, int a, int b);
/------------------ 离散小波变换程序--------------------------------/
//2维小波变换
void Wavelet2d (BYTE image_in, int xsize, int ysize, double s1, double w1v,
double w1h, double w1d);
//2维小波信号图像化
void Wavelet2d_image (double s1, double w1v, double w1h, double w1d,
BYTE image_out, int xsize, int ysize);
//2维逆小波变换
void Iwavelet2d (double s1, double w1v, double w1h, double w1d,
BYTE image_out, int xsize, int ysize );
//1维小波变换
void Wavelet1d (double s0, int s_len, double p, double q,
int sup, double s1, double w1);
//1维逆小波变换
void Iwavelet1d (double s1, double w1, int s_len, double p,
double q, int sup, double s0);
/---------------------模式识别---------------------------------/
//K-邻近法模式识别
void KMeans(double Pattern, int NumPatterns, int SizeVector, int NumClusters, aCluster Cluster);
/---------------------神经网络文字识别---------------------------------/
//倾斜调整
void Slope_adjust(BYTE image_in, BYTE image_out, int xsize, int ysize);
//文字分割
CRectLink Char_segment(BYTE image_in, int xsize, int ysize, int &digicount);
//文字宽度调整
void Std_char_rect(BYTE image_in, BYTE image_out, int xsize, int ysize, CRectLink &charRect);
//文字规整排列
void Auto_align(BYTE image_in, BYTE image_out, int xsize, int ysize, CRectLink &charRect);
//申请2维双精度实数数组
double alloc_2d_dbl(int m, int n);
//提取特征向量
void Code(BYTE image_in, int xsize, int ysize, int num, double data );
//BP网络训练
void BpTrain(double data_in, double data_out, int n_in, int n_hidden, double min_ex, double momentum, double eta, int num);
//读取各层结点数目
bool r_num(int n,char name);
//文字识别
void CodeRecognize(double data_in, int num ,int n_in,int n_hidden,int n_out);
/---------------------遗传算法---------------------------------/
//画直线
void Draw_line (BYTE image, int xsize, int sx, int sy, int ex, int ey, unsigned char gray_level);
//画点
void Draw_point (BYTE image, int xsize, int x, int y, unsigned char gray_level);
//画园
void Draw_circle (BYTE image, int xsize, int ysize, int x_center, int y_center, int radius,
unsigned char gray_level);
//画矩形
int Draw_rectangle( BYTE image, int xsize, int ysize ,int sx, int sy, int ex, int ey,
unsigned char draw_gray_level );
//画数字
void Draw_number_image(BYTE image, int xsize, int ysize, int number, int x, int y,
BYTE char_gray); //注:该函数不对外提供
//染色体的二点交叉函数
void two_crossover( unsigned char gene, int g1, int g2, int g3, int g4, int length );
//染色体的变异
void ga_mutation(unsigned char gene, int pop_size, int length, double m_rate );
//染色体的变异,由g1、g2的亲代,生成g3、g4的子代
void make_offspring( int g1, int g2, int g3, int g4 );
//简单GA的选择函数
void ga_reproduction();
//生成模板
void Ga_set_model(BYTE image, int xsize, int ysize, int sx, int sy, int ex, int ey, int model_type, int noise);
//生成原图像
void Ga_set_image(BYTE image, BYTE image_dim, int xsize, int ysize, int sx, int sy, int ex, int ey);
//基于GA的搜索
void Ga_search(BYTE image, BYTE image_him, int xsize, int ysize, int xsize_dim);
// 基于随机搜索的搜索
void Random_search(BYTE image, BYTE image_dim, int xsize, int ysize, int xsize_dim);
/---------------图像压缩程序---------------------------------/
//预测编码 DPCM (预测法(1):处理一行区域)
void Dpcm1(BYTE image_in, int xsize, int line, short data_out);
//预测编码 DPCM (预测法(2):处理一行区域)
void Dpcm2(BYTE image_in, int xsize, int line, short data_out);
//DPCM数据分布直方图
void Histgram_dpcm(BYTE image, int xsize, int ysize, long hist[512]);
//计算DPCM直方图百分比
void CalHistPercent_dpcm(long hist[], float hist_radio[], float &max_percent);
//DPCM的解码 (预测法(1):处理一行区域)
void Idpcm1(short data_in, int xsize, int line, BYTE image_out);
//DPCM的解码 (预测法(2):处理一行区域)
void Idpcm2(short data_in, int xsize, int line, BYTE image_out);
//变长编码
int Vlcode(short int data_in[], int no, char vlc_out[]);
//变长编码的解码
void Ivlcode(char vlc_in[], int no, short int data_out[]);
//由DPCM码到变长码的变换
int Event(short dt);
//由变长码到DPCM码的转换
int Ievent(short ev);
//DPCM + 变长编码
int Dpcm_vlcode(BYTE image_in, int xsize, int ysize, BYTE image_buf);
//DPCM + 变长编码的解码
int Idpcm_vlcode(BYTE image_buf, BYTE image_out, int xsize, int ysize);
-END-