2007-07-03 22:32:00 begtostudy 阅读数 7863
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29973 人正在学习 去看看 张中强

以往的图像处理函数实现,多是针对图像句柄。算法实现 需要操作复杂的图像文件。

但是,这种方式算法实现和调试的周期比较长。为了加速开外,我在中间插入的矩阵库。因为图像处理算法多是针对矩阵,所以实现和调试比较快。

 

PS:2009.10.27

这是我博客最烂的帖子,但是却有如此多的访问量,唉。

其实算法的代码是不可能公开的,因为算法的关键部分申请了软件著作权的。

不过,其基础图像库和矩阵类,两个部分早已在这个博客里公开了。

图像库:http://code.google.com/p/begtostudy-imagelib/

矩阵类:http://blog.csdn.net/begtostudy/archive/2006/12/18/1448216.aspx

至于核心算法只能去看我的硕士论文了。不过估计你们找不到,呵呵。

2017-04-04 16:24:42 u013085897 阅读数 9048
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29973 人正在学习 去看看 张中强
       做了那么多滤镜,今天写一篇关于滤镜的博客。可能是现在滤镜太多了,现在所有的图像相关app,基本都有滤镜功能,同时还有很多开源滤镜程序。美食滤镜、风景滤镜、人像滤镜,每家滤镜都各有特色,可以说没有最好,只有更有特色的滤镜,不过身边很多人还是比较推崇VSCO的滤镜。
       那么滤镜程序都是如何实现的呢?我以前的工作流程是,滤镜效果由设计师使用ps设计,设计滤镜常用的ps功能是:调节饱和度及色相、调节曲线、叠加纹理等等,通过调节饱和度和色相,可以有针对性的调节某一个色系,使之变浓、变淡或者改变色调,而其他色系不变。同样,对rgb某一个通道进行曲线调节,可以非线性的拉伸或压缩某一颜色通道对整幅图像的影响,实现精细化的色调调节。叠加纹理要简单一些,将设计好的纹理,通过某种混合操作,叠加在原图上,实现各种特效,比如lomo滤镜,暗角除了可以通过算法生成外,也可以通过叠加纹理实现。而程序员拿到设计师的滤镜设计稿后,要做的就是编写程序高度还原设计效果。这一点多多少少还是有些挑战,因为ps经过多年发展后,不同版本有些功能效果还不一样,比如最为常见的亮度、对比度调节,算法很简单,但是要做到和ps效果一样,还是要花时间摸索、调试。我当时在实现过程中,比较难还原的是分色系:红、黄、绿、青、蓝、洋红进行饱和度及色相调节,比如整幅图像,只对红色部分进行调节,但是如果程序处理不佳,在红与黄、洋红颜色过渡带,会出现非常明显的色块、锯齿等各种非常差的效果,而ps就不会。这时就要反复推测ps的实现方式,努力做到自己的程序和ps效果一样。所以,滤镜其实也没什么复杂原理及公式推导,就是通过编写程序模拟ps各种操作,以还原设计师的设计效果。这里要提一下,对于图像处理算法工程师,如果ps不熟,那不及格的,哈哈。
       下面是一些滤镜效果图,主要包括黑白滤镜、美食滤镜、风景滤镜等。
    
    
    
       
       
       
    
    
    





2019-10-26 22:19:44 iiiyg 阅读数 18
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29973 人正在学习 去看看 张中强


在图像算法处理流程设计好之后,在调试过程中可能会遇到图像数据错乱,这时就需要用一些技术手段将图像数据转储出来看哪里出了问题。
本文以VS2019为例提供三种把图像数据转储到硬盘的方法。

1.使用重定向printf

inline void openlog()
{
	errno_t err;
	FILE* stream;
	err = freopen_s(&stream, "F:\image_debug_data.txt", "w", stdout);
	if (err != 0)
		fprintf(stdout, "error on freopen\n");
	fprintf(stdout, "test\n");
}

2. 将图像数据写入文件

int dumpdate(uint32_t numPix, int frameType, int frameNum)
{
	uint32_t numPixDump;
	FILE* frameBufHandle = NULL;
	char dumpFilename[256] = { 0 };
	snprintf(dumpFilename, sizeof(dumpFilename), "TestFrame_type%d_num%d.txt", frameType, frameNum);

	frameBufHandle = fopen(dumpFilename, "w");
	int write_length = fwrite(pBuf->frameBuf, 1, numPix, frameBufHandle);

	printf("write_length = %d\n", write_length);
	fclose(frameBufHandle);
	return 0

3.使用opencv

Mat img_src(nRows, nCols, CV_16UC1);

	for (int i = 0; i < nRows; i++) {
		for (int j = 0; j < nCols; j++) {
			img_src.at<uint16_t>(i, j) = FrameData[i * nCols + j];
		}
	}

cout << "img_src (csv) = " << endl << cv::format(img_src, Formatter::FMT_CSV) << endl << endl;

本文以代码片段的形式简短的记录了图像算法调试中数据转储的一些方法。如果您有更好的方法欢迎和我探讨。

2017-05-02 17:25:32 u013085897 阅读数 5031
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29973 人正在学习 去看看 张中强
       很多图像处理算法,编写完毕、调试正确后,就是漫长的算法优化。有些算法处理效果很棒,但是运算非常耗时,还是无法集成进产品给用户用。本文介绍的基于多线程和图像分块实现加速运算,只是众多加速方法的一种,比较容易编写和实现。还有更底层的加速方法,如编写指令集加速运算(intel芯片的sse指令集或者arm芯片的neon指令集),即SIMD(Single Instruction Multiple Data,单指令多数据)技术,不过如果if条件判断比较多的话,编写会很头疼,本人目前在这方面代码量还不够,还写不出太多心得。
       对于一副图像,比如1000*800分辨率,我们在处理时,通常思路是从第1个像素开始,一直计算到最后一个像素。其实,目前不论手机还是个人电脑,处理器都是多核。那么完全可以将整副图像分成若干块,比如cpu为4核处理器,那么可以分成4块,每块图像大小为1000*200,这样程序可以创建4个线程,每个处理器执行一个线程,每个线程处理一个图像块。虽然这样操作后,运算速度不会显著提升4倍,因为线程创建、释放、上下文切换都要耗些时间。但运算速度还是将明显提升,一般4核 vs 1核,运算时间将降低一半。下面为完整代码,基本可以通用。
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include "pthread.h"
#include <time.h>

using namespace cv;
using namespace std;

#ifndef uchar
#define uchar  unsigned char
#endif

#ifndef MAX 
#define MAX(x, y)  (((x) >= (y)) ? (x) : (y))
#endif

#ifndef MIN 
#define MIN(x, y)  (((x) >= (y)) ? (y) : (x))
#endif

#define CLAMP_XY(x, y) (((x) < 0) ? 0 : ((x) > (y) ? (y) : (x)))

#define AXJ_BLUE 	0
#define AXJ_GREEN	1
#define AXJ_RED 	2
#define BMPFORMAT_RGB32_R8G8B8A8	4

typedef struct __tag_bmpinfo
{
	unsigned int dwPixelFormat;
	int lWidth;
	int lHeight;
	int lPitch[3];
	unsigned char* pPlane[3];
}BMPINFO, *LPBMPINFO;

typedef struct __filter_info
{
	BMPINFO *pSrcBitmap;
	float intensity;

	int param0;
	int param1;
} FilterInfo, *PFilterInfo;

// 转黑白图像
void ConvertToBlackWhite(BMPINFO *pSrcBitmap)
{
	uchar lightness = 0, max_val = 0, min_val = 0;
	uchar * pSrcData = pSrcBitmap-> pPlane[0];
	int size = pSrcBitmap->lWidth * pSrcBitmap->lHeight;
	for (int i = 0; i < size; i++, pSrcData += 4)
	{
		max_val = MAX(MAX(pSrcData[AXJ_BLUE], pSrcData[AXJ_GREEN]), pSrcData[AXJ_RED]);
		min_val = MIN(MIN(pSrcData[AXJ_BLUE], pSrcData[AXJ_GREEN]), pSrcData[AXJ_RED]);
		lightness = (max_val + min_val + 1) / 2;
		pSrcData[AXJ_BLUE] = pSrcData[AXJ_GREEN] = pSrcData[AXJ_RED] = lightness;
	}
}

// 计算线程
void* ImageFilterThread(void *arg)
{
	FilterInfo *filter_info = (FilterInfo *)arg;
	BMPINFO *pSrcBitmap = filter_info->pSrcBitmap;
	int intensity = (int)CLAMP_XY(filter_info->intensity * 256, 256);

	uchar *dataCopy = (uchar *)malloc(pSrcBitmap->lPitch[0] * pSrcBitmap->lHeight);
	memcpy(dataCopy, pSrcBitmap->pPlane[0], pSrcBitmap->lPitch[0] * pSrcBitmap->lHeight);

	// 以彩色图像转黑白图像为例(印象里ps3就是这个算法)
	ConvertToBlackWhite(pSrcBitmap);

	// 输出结果
	uchar *src_data = dataCopy;
	uchar *dst_data = pSrcBitmap->pPlane[0];
	int size = pSrcBitmap->lWidth * pSrcBitmap->lHeight;
	for (int i = 0; i < size; i++, src_data += 4, dst_data += 4)
	{
		dst_data[0] = (src_data[0] * (256 - intensity) + dst_data[0] * intensity) >> 8;
		dst_data[1] = (src_data[1] * (256 - intensity) + dst_data[1] * intensity) >> 8;
		dst_data[2] = (src_data[2] * (256 - intensity) + dst_data[2] * intensity) >> 8;
	}

	free(dataCopy);
	dataCopy = NULL;

	return NULL;
}

// 分块计算
void ImageFilterCommon(BMPINFO *pSrcBitmap, int block_count)
{
	// 计算分块参数
	int block_src_height = pSrcBitmap->lHeight / block_count;
	int block_src_size = pSrcBitmap->lPitch[0] * block_src_height;

	pthread_t *block_thread = (pthread_t *)malloc(block_count * sizeof(pthread_t));
	BMPINFO *block_src_bmp  = (BMPINFO *)malloc(block_count * sizeof(BMPINFO));
	FilterInfo *filter_info_array = (FilterInfo *)malloc(block_count * sizeof(FilterInfo));

	// 前n-1块
	int i = 0;
	for (i = 0; i < block_count - 1; i++)
	{
		memset(&block_src_bmp[i], 0, sizeof(BMPINFO));
		memset(&filter_info_array[i], 0, sizeof(FilterInfo));

		block_src_bmp[i].dwPixelFormat = BMPFORMAT_RGB32_R8G8B8A8;
		block_src_bmp[i].lWidth = pSrcBitmap->lWidth;
		block_src_bmp[i].lHeight = block_src_height;
		block_src_bmp[i].lPitch[0] = pSrcBitmap->lPitch[0];
		block_src_bmp[i].pPlane[0] = pSrcBitmap->pPlane[0] + block_src_size * i;

		filter_info_array[i].pSrcBitmap = &block_src_bmp[i];
		filter_info_array[i].intensity = 0.8f;

		pthread_create(&block_thread[i], NULL, ImageFilterThread, &filter_info_array[i]);
	}

	// 最后一块
	i = block_count - 1;
	memset(&block_src_bmp[i], 0, sizeof(BMPINFO));
	memset(&filter_info_array[i], 0, sizeof(FilterInfo));

	block_src_bmp[i].dwPixelFormat = BMPFORMAT_RGB32_R8G8B8A8;
	block_src_bmp[i].lWidth = pSrcBitmap->lWidth;
	block_src_bmp[i].lHeight = pSrcBitmap->lHeight - block_src_height * i;
	block_src_bmp[i].lPitch[0] = pSrcBitmap->lPitch[0];
	block_src_bmp[i].pPlane[0] = pSrcBitmap->pPlane[0] + block_src_size * i;

	filter_info_array[i].pSrcBitmap = &block_src_bmp[i];
	filter_info_array[i].intensity = 0.8f;

	pthread_create(&block_thread[i], NULL, ImageFilterThread, &filter_info_array[i]);

	// 阻塞主线程, 等待分块计算完成
	for (i = 0; i < block_count; i++)
	{
		pthread_join(block_thread[i], NULL);
	}

	// todo 结果合成
	// 类似于调色这样的计算, 不需要将各个块合成整幅图像
	// 但如果涉及空间计算, 每个块间需要有重叠部分, 此时需要针对算法特点, 编写合成方法

	// 释放资源
	free(block_src_bmp);
	block_src_bmp = NULL;

	free(filter_info_array);
	filter_info_array = NULL;

	free(block_thread);
	block_thread = NULL;
}

int main()
{
	const char* fileName = "test.png";
	Mat src = imread(fileName);
	imshow("src", src);

	BMPINFO srcbmp = { 0 }, texbmp = { 0 }, texbmp2 = { 0 }, lutbmp = { 0 };
	srcbmp.dwPixelFormat = BMPFORMAT_RGB32_R8G8B8A8;
	srcbmp.lWidth = src.cols;
	srcbmp.lHeight = src.rows;
	srcbmp.lPitch[0] = srcbmp.lWidth * 4;
	srcbmp.pPlane[0] = (unsigned char*)malloc(srcbmp.lPitch[0] * srcbmp.lHeight);

	uchar *pTempData = src.data;
	uchar *pdata = srcbmp.pPlane[0];
	for (int i = 0; i < src.rows * src.cols; i++, pdata += 4, pTempData += 3)
	{
		pdata[0] = pTempData[0];
		pdata[1] = pTempData[1];
		pdata[2] = pTempData[2];
		pdata[3] = 255;
	}

	///////////////////////////////////////////////////////
	clock_t startTime = clock();
	ImageFilterCommon(&srcbmp, 4);
	printf("the time is.... %d ms\n", clock() - startTime);
	///////////////////////////////////////////////////////

	Mat dst(cv::Size(srcbmp.lWidth, srcbmp.lHeight), src.type());
	pTempData = dst.data;
	pdata = srcbmp.pPlane[0];
	for (int i = 0; i < dst.rows * dst.cols; i++, pdata += 4, pTempData += 3)
	{
		pTempData[0] = pdata[0];
		pTempData[1] = pdata[1];
		pTempData[2] = pdata[2];
	}
	imshow("dst", dst);

	cv::waitKey();
	return 0;
}
    
    
       
       完整工程下载链接:http://download.csdn.net/detail/u013085897/9831338,第一次上传三个多小时后都没有显示,以为失败了,于是又上传了一次,结果今天早晨都显示出来了,然后想删掉一份,又无法删除。csdn的这个审核机制有点坑,无法及时删除资源,也挺坑的,不知道是基于什么考虑。



2009-06-16 10:08:00 zhoubl668 阅读数 21184
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29973 人正在学习 去看看 张中强

 图像识别算法实现收藏

以往的图像处理函数实现,多是针对图像句柄。算法实现 需要操作复杂的图像文件。

但是,这种方式算法实现和调试的周期比较长。为了加速开外,我在中间插入的矩阵库。因为图像处理算法多是针对矩阵,所以实现和调试比较快。

 

 

 

////////////////////////////////////////////////////////////////////

指纹图像识别算法的基本原理介绍

在有的国家,指纹属于个人隐私,不能象人工处理那样直接处理指纹图像,所以许多生物识别技术并不直接存储指纹的图像。多年来在各个公司及其研究机构产生了许多不同的数字化算法。指纹识别算法虽然各不相同但是这些算法最终都归结为在指纹图像上找到并比对指纹的特征。我们定义了指纹的两类特征来进行指纹的验证:总体特征和局部特征。  



  A 总体特征:总体特征是指那些用肉眼就可以直接观察到的特征,包括:   

  1. 纹形 

  其他的指纹图案都基于这三种基本图案。仅仅依靠纹形来分辨指纹是远远不够的,这只是一个粗略的分类,通过更详细的分类使得在大数据库中搜寻指纹更为方便快捷。  

  2. 模式区  

  模式区是指指纹上包括了总体特征的区域,即从模式区就能够分辨出指纹是属于那一种类型的。有的指纹识别算法只使用模式区的数据。 SecureTouch的指纹识别算法使用了所取得的完整指纹而不仅仅是模式区进行分析和识别。  

  3. 核心点  

  核心点位于指纹纹路的渐进中心,它在读取指纹和比对指纹时作为参考点。许多算法是基于核心点的,既只能处理和识别具有核心点的指纹。核心点对于SecureTouch的指纹识别算法很重要,但没有核心点的指纹它仍然能够处理。  

  4. 三角点  

  三角点位于从核心点开始的第一个分叉点或者断点、或者两条纹路会聚处、孤立点、折转处,或者指向这些奇异点。三角点提供了指纹纹路的计数跟踪的开始之处。  

  5. 纹数  

  指模式区内指纹纹路的数量。在计算指纹的纹数时,一般先在连接核心点和三角点,这条连线与指纹纹路相交的数量即可认为是指纹的纹数。  

  B 局部特征 

  局部特征是指指纹上的节点的特征,这些具有某种特征的节点称为特征点。两枚指纹经常会具有相同的总体特征,但它们的局部特征--特征点,却不可能完全相同。指纹纹路并不是连续的、平滑笔直的,而是经常出现中断、分叉或打折。这些断点、分叉点和转折点就称为“特征点”。就是这些特征点提供了指纹唯一性的确认信息。指纹上的节点有四种不同特性:   

  1.特征点的分类:有以下几种类型,最典型的是终结点和分叉点。  

  终结点  

  一条纹路在此终结。   

  分叉点  

  一条纹路在此分开成为两条或更多的纹路。   

  分歧点 

  两条平行的纹路在此分开 

  孤立点 

  一条特别短的纹路,以至于成为一点。   

  环点 

  一条纹路分开成为两条之后,立即有合并成为一条,这样形成的一个小环称为环点。   

  短纹

  一端较短但不至于成为一点的纹路。   

  2.方向: 节点可以朝着一定的方向。   

  3.曲率:描述纹路方向改变的速度。   

  4.位置:节点的位置通过(x, y)坐标来描述,可以是绝对的,也可以是相对于三角点或特征点的。
//////////////////////////////////////////////////////////////////////////////////////////////

基于图像识别算法的森林防火系统设计
传统的森林火灾监测技术包括人工护林监测、飞机航测、卫星监测等.本文提出一种基于普通CCD摄像头和嘹望塔上现有的短波无线通信设备的森林防火监测系统,根据实时图像与参考图像的差分及小波分解结果,当有异常情况发生时,提取出火焰及烟雾区域,判断提取区域是否具有烟雾和火焰的动态特征.若判定发生火灾,即将压缩后的图像通过短波通信设备传回指挥中心.
//////////////////////////////////////////////////////////////////
车辆牌照图像识别算法研究与实现
第1章 绪论 1
1.1 课题研究背景 1
1.2 车辆牌照识别系统原理 1
1.3 车辆牌照识别在国内外研究现状 2
1.4 本文主要工作及内容安排 3
第2章 车辆牌照的定位方法 4
2.1 车辆牌照图像的预处理 4
2.1.1 256色位图灰度化 4
2.1.2 灰度图像二值化 5
2.1.3 消除背景干扰去除噪声 6
2.2 车辆牌照的定位方法简介 6
2.3 系统采用的定位方法 7
2.3.1 车辆牌照的水平定位 7
2.3.2 车辆牌照的垂直定位 7
2.3.3 定位的算法实现 10
2.4 实验结果分析 12
第3章 车辆牌照的字符分割 13
3.1 车牌预处理 13
3.1.1 去边框处理 13
3.1.2 去噪声处理 13
3.1.3 梯度锐化 15
3.1.4 倾斜调整 16
3.2 字符分割方法简介 17
3.3 系统采用的分割方法 19
3.3.1 算法介绍 19
3.3.2 算法的实现 20
3.4 字符分割实验结果 21
第4章 特征提取与字符识别 22
4.1 字符的特征提取 22
4.2 字符的识别方法简介 23
4.3 系统采用的识别方法 24
4.3.1 人工神经网络简介 24
4.3.2 BP神经网络识别车牌 25
4.3.3 BP神经网络识别算法实现 28
4.4 实验结果分析 29
总结 32
致谢 33
参考文献 34

////////////////////////////////////

VC++图像处理软件

阅读数 1568

图像处理相关问题

阅读数 225

图像采集调试总结

阅读数 1286

没有更多推荐了,返回首页