最小值滤波 (C 语言实现)

遇到最小值滤波的问题,小白不知道。一个程序写了三天,最终今天傍晚出来了。

。。

非常easy的for循环。可是没有理解最小值滤波。怎么写都是错啊~

这是我见过做好的描写叙述,关于最小值滤波:

3*3的像素点阵,对于中心点做最小值滤波的话,它的值将从77变换到0

处理结果图:

我一直支持也坚持开源分享的原则。为大家更好的相互学习,给出源码

/******************************************************************
code writer : EOF
code date : 2014.08.07
e-mail : jasonleaster@gmail.com jasonleaster@163.com code purpose:
This demo is coded for mininum value filter.
If you find something wrong with my code, please touch me by e-mail.
Thank you. *******************************************************************/ #include "opencv2/highgui/highgui_c.h"
#include "opencv2/imgproc/imgproc_c.h" #include <stdio.h> /*------------------------------------------------------------------------------ This two Macro are used for debugging, if you are begginer with OpenCV,
it will help you to know and test what inside of the data struture in OpenCV -------------------------------------------------------------------------------*/ //#define RGB_TEST_DEBUG
//#define CHANNEL_TEST_DEBUG /* the offset of three channel RGB */
#define RED_BIT 2
#define GREEN_BIT 1
#define BLUE_BIT 0 #define SQUARE_LENGTH 15 int get_dark_imagine(IplImage* const img_origin,IplImage* const img_win_dark); int main(int argc,char* argv[])
{
char* win_name_bf = "Before Processing";
char* win_name_af = "After Processing"; CvSize size; IplImage* img_origin = cvLoadImage(argv[1],CV_LOAD_IMAGE_COLOR); size.height = img_origin->height;
size.width = img_origin->width; IplImage* img_win_dark = cvCreateImage(size,IPL_DEPTH_8U,1);//single channel get_dark_imagine(img_origin,img_win_dark); cvNamedWindow(win_name_bf,CV_WINDOW_AUTOSIZE);
//cvNamedWindow is a function which would help you to creat a window. cvShowImage(win_name_bf,img_origin);
//Obviously, show the picture that you inputed. cvNamedWindow(win_name_af,CV_WINDOW_AUTOSIZE);
//cvNamedWindow is a function which would help you to creat a window. cvShowImage(win_name_af,img_win_dark);
//Obviously, show the picture that you inputed. cvWaitKey(0);
//pause and let the user see the picture. cvReleaseImage(&img_origin);
cvReleaseImage(&img_win_dark);
//Finally, release the struture, otherwise, memory leak ! return 0;
} int get_dark_imagine(IplImage* const img_origin,IplImage* const img_win_dark)
{
/*
Varible description: @img_origin : A pointer which point to the original picture's IplImage-structure.
@img_win_dark: A pointer which point to the dark-window's IplImage-structure.
*/ if(img_origin == NULL || img_win_dark == NULL)
{
printf("Error! img_origin or img_win_dark is NULL\n"); return 1;
} int height_origin = img_origin->height ;
int width_origin = img_origin->width ;//the search band width. unsigned char * const ptr_array_origin = (unsigned char*)img_origin->imageData;
unsigned char * const ptr_array_win_dark = (unsigned char*)img_win_dark->imageData; unsigned char* ptr_header_origin = NULL; int row = 0;
int col = 0;
int square_row = 0;
int square_col = 0; int min = 0;
int T_min = 0;
int temp_R = 0;
int temp_G = 0;
int temp_B = 0;
int temp = 0; int search_win_start = SQUARE_LENGTH/2; /*
define two varible -- height_origin & width_origin for up band-width of the search-window
*/ int search_win_height_end = img_win_dark->height - SQUARE_LENGTH/2;
int search_win_width_end = img_win_dark->width - SQUARE_LENGTH/2; //initializition of the picture's data that 'ptr_array_win_dark' point to.
for(row = 0; row < height_origin; row++)
{
for(col = 0; col < width_origin ;col++)
{
*(ptr_array_win_dark + col + row*(img_win_dark->widthStep)) = 255; }
} //Mininum value filter
for(row = search_win_start; row < search_win_height_end; row++)
{ for(col = search_win_start; col < search_win_width_end ;col++)
{ ptr_header_origin = ptr_array_origin + (row)*(img_origin->widthStep) + (col)*3; temp_B = *(ptr_header_origin + BLUE_BIT );
temp_G = *(ptr_header_origin + GREEN_BIT );
temp_R = *(ptr_header_origin + RED_BIT ); min = (temp_G < temp_B) ? temp_G : temp_B;
min = (min < temp_R) ? min : temp_R; T_min = min; for(square_row = (row - search_win_start); square_row < (row + search_win_start + 1);square_row++)
{
for(square_col = (col - search_win_start); square_col < (col+search_win_start + 1);square_col++)
{
min = *(ptr_array_win_dark + square_col + square_row*(img_win_dark->widthStep)); if (min > T_min)
{
*(ptr_array_win_dark + square_col + square_row*(img_win_dark->widthStep)) = (T_min);
}
}
}
}
} return 0;
}

如有错误。欢迎交流指正

—— EOF

update : 2014.10.05

写了一个matlab版本号的最小滤波算法框架

Img_filted = dark_channel;
for row = 1 : height
for col = 1 : width min_value = dark_channel(row,col);
for patch_row = (row -floor(search_win_height/2)) : (row + floor(search_win_height/2))
for patch_col = (col - floor(search_win_width/2)) : (col + floor(search_win_width/2)) if patch_row > 0 && patch_col > 0 && patch_row <= height && patch_col <= width
if min_value < Img_filted(patch_row,patch_col)
Img_filted(patch_row,patch_col) = min_value;
end
end
end
end
end
end

最小值滤波 (C 语言实现)的更多相关文章

  1. 中值滤波C语言优化

    中值滤波C语言优化 图像平滑是图像预处理的基本操作,本文首先用不同的方法对一张图片做预处理比较它们效果的不同,然后针对中值滤波,实现了一种快速实现.(其实是copy的opencv实现,呵呵).因为op ...

  2. OpenCV之邻域运算之最值滤波

    写了一段小程序,分享给大家! //==================================================================== // 作者 : quarry ...

  3. 基于R语言的数据分析和挖掘方法总结——描述性统计

    1.1 方法简介 描述性统计包含多种基本描述统计量,让用户对于数据结构可以有一个初步的认识.在此所提供之统计量包含: 基本信息:样本数.总和 集中趋势:均值.中位数.众数 离散趋势:方差(标准差).变 ...

  4. Opencv中常见的滤波方法

    滤波(模糊)的概念和作用: 图像滤波增强处理实质上就是运用滤波技术来增强图像的某些空间频率特征,以改善地物目标与领域或背景之间的灰度反差. 遥感系统成像过程中可能产生的”模糊”作用,常使遥感图像上某些 ...

  5. 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)

    最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道< ...

  6. paper 105: 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他

    在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者 ...

  7. Single Image Haze Removal Using Dark Channel Prior

    <Single Image Haze Removal Using Dark Channel Prior>一文中图像去雾算法的原理.实现.效果及其他. Posted on 2013-08-2 ...

  8. MinFilter(MaxFilter)快速算法C++实现

    目录 1.算法简述 1.1.MinFilter(MaxFilter) 算法简述 1.2.MinFilter(MaxFilter) 快速算法简述 2.实现代码 2.1.MinFilterOneRow 单 ...

  9. 任意半径局部直方图类算法在PC中快速实现的框架。

    在图像处理中,局部算法一般来说,在很大程度上会获得比全局算法更为好的效果,因为他考虑到了图像领域像素的信息,而很多局部算法可以借助于直方图获得加速.同时,一些常规的算法,比如中值滤波.最大值滤波.最小 ...

随机推荐

  1. 系统变量写在.bash_profile和.bashrc的区别

    今天配置一个代理,正儿八经的把我搞蒙了,不就是export http_porxy=xxx.xxx.xxx.xxx:xxxx 然后重启服务service network restart ,依然连接不了外 ...

  2. BZOJ 2440 完全平方数(莫比乌斯反演+二分查找)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23362 题意:定义含有平方数因子的数为完全平方数(平方数因子不包含 ...

  3. PHP输出中文乱码的解决方法

    最近在windows上发现PHP程序中输出来的中文有乱码的情况. 看了很多帖子资料说可以在页面上添加: http://www.cnblogs.com/leandro/archive/2008/04/2 ...

  4. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  5. Ubuntu安装配置TFTP服务

    tftpd-hpa 是一个功能增强的TFTP服务器.它提供了很多TFTP的增强功能,它已经被移植到大多数的现代UNIX系统. 1.安装 sudo apt-get install tftpd-hpa t ...

  6. Protel99se教程四:将SCH转为PCB文件

    本节课,我们介绍,如何快速的将绘制好的SCH文件转为PCB文件,首先,我们打开刚开始时我们绘制的SCH原理图,我们可以使用protel99se菜单栏的view-Fit All Objects命令,以查 ...

  7. kinect for windows - 手势识别之一,C++实现

    用C++来实现手势识别是比较困难的,所以在这个例子,我们只实现了握拳和松手的手势识别,其他没有实现. 先上个效果图: 在这个程序里,我们打开了kinect的RGB流,深度流,骨骼数据流和手势识别流.其 ...

  8. openstack之Glance

    一.Glance简介.基本概念: Glance是openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找.注册和检索等操作. Glance提供restful API可以查询虚拟机镜像的m ...

  9. jvm的内存区域简介

    1.内存区域划分 jvm在执行java程序过程中会将管理的内存划分成若干不同的数据区域,他们分别是程序计数器,堆,方法区,虚拟机栈,本地方法栈. 1.1指令计数器 指令计数器是线程私有的,每个线程都有 ...

  10. Java基础之编程语法(一)

    1.基本格式 所有Java代码都应该在一个class中. Java是严格区分大小写的. Java是一种自由格式的语言.Java代码分为结构定义语句和功能执行语句,功能执行语句最后必须以分号结束. 2. ...