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

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

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

很简单的for循环,但是没有理解最小值滤波,怎么写都是错啊~

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

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

处理结果图:

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

/******************************************************************
code writer : EOF
code date : 2014.08.07
e-mail  : [email protected] [email protected]

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

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

时间: 2024-11-11 05:27:39

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

图像去雾 利用最小值滤波(待改进)

图像去雾 我的个神啊~ 调了这么久终于阶段性"胜利了" -- 利用最小值滤波正确实现图像去雾. 因为是C语言实现,很多细节都要注意,很砸时间--本来看起来很简单的程序,就是有bug,debug的时间很长了,这也是一种锻炼吧,难得的实战机会.磨C 这把刀这么久了,是该做做具体应用了!刀子是否锋利,要接受考验! 程序很大程度上没有利用OpenCV的一些数据操作的接口,除了图像显示和读取之外,其他的数据处理部分都是自己实现的.这几天的时间全砸进去了~ 暑假哇~时间过的慢点可好~ 由于项目正在

均值滤波,中值滤波,最大最小值滤波

http://blog.csdn.net/fastbox/article/details/7984721 讨论如何使用卷积作为数学工具来处理图像,实现图像的滤波,其方法包含以下几种,均值 滤波,中值滤波,最大最小值滤波,关于什么是卷积以及理解卷积在图像处理中作用参见这 里–http://blog.csdn.net/jia20003/article/details/7038938 均值滤波: 均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高 频信号将会去掉,因此可以

中值滤波C语言优化

中值滤波C语言优化 图像平滑是图像预处理的基本操作,本文首先用不同的方法对一张图片做预处理比较它们效果的不同,然后针对中值滤波,实现了一种快速实现.(其实是copy的opencv实现,呵呵).因为opencv的实现方法感觉太好了,今天就特别写下来.既有备忘的作用,同时如果谁看到这篇文章,也可以借鉴下opencv的实现.   1 原始图像 2 均值滤波图像 3 中值滤波图像 4 双边滤波图像 5 高斯滤波图像     上图的代码 void CDialogTest2013Dlg::OnBnClick

均值滤波,中值滤波,最大值滤波,最小值滤波

均值滤波: 均值滤波是图像处理中常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高频信号将被去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能.理想的均值滤波是用每个像素和它周围像素计算出来的均值替换图像中每个像素.采样Kernel数据通常是3x3的矩阵,如下所示: 从左到右,从上到下计算图像中的每个像素,最终得到处理后的图像.均值滤波可以加上两个参数,即迭代次数,kernel数据大小. 一个相同大小的kernel,经过多次迭代效果会越来越好. 同样:迭代次数相同,均值滤波的效果

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

1.1 方法简介 描述性统计包含多种基本描述统计量,让用户对于数据结构可以有一个初步的认识.在此所提供之统计量包含: 基本信息:样本数.总和 集中趋势:均值.中位数.众数 离散趋势:方差(标准差).变异系数.全距(最小值.最大值).内四分位距(25%分位数.75%分位数) 分布描述:峰度系数.偏度系数 用户可选择多个变量同时进行计算,亦可选择分组变量进行多组别的统计量计算. 1.2 详细介绍 1.2.1 样本数和总和 1. R语言涉及的方法:length(x) 1.2.2 均值(Mean) 1.

《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果

本文完全转载:http://www.cnblogs.com/Imageshop/p/3281703.html,再次仅当学习交流使用.. <Single Image Haze Removal Using Dark Channel Prior>一文中图像去雾算法的原理.实现.效果(速度可实时) 本文算法合作联系QQ: 33184777, 非诚勿扰 邮件地址:   [email protected] 最新的效果见 :http://video.sina.com.cn/v/b/124538950-125

高级图像去雾算法的快速实现(转载)

原文:http://blog.csdn.net/laviewpbt/article/details/11555877 最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者何凯明博士,2007年清华大学毕业

图像处理URL

随笔分类 - 图像处理/图像增强等 图像增强: 图像复原: 图像重建: 图像分割: 图像特效: 图像匹配: 图像形态学处理: 图像几何处理: 图像正交变换: 人工智能: 跟踪: 图像处理之增强---图像模糊检测 摘要: 这种检测可以做宽动态的检测,也可应用稳像算法我们实现了拉普拉斯方差算法,该算法提供给我们一个浮点数来代表具体图像的"模糊度".该算法快速,简单且易于使用--用拉普拉斯算子与输入图像做卷积然后计算方差即可.如果方差低于预定义阈值,图像就被标记为"模糊"

图像处理之基础---卷积去噪

讨论如何使用卷积作为数学工具来处理图像,实现图像的滤波,其方法包含以下几种,均值 滤波,中值滤波,最大最小值滤波,关于什么是卷积以及理解卷积在图像处理中作用参见这 里–http://blog.csdn.net/jia20003/article/details/7038938 均值滤波: 均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高 频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能.理想的均 值滤波是用每个像素和它周围像素计算出来的平均值替