⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ieimageedge.cpp

📁 刚上传内容的相关CODEC不能单独上传。于是
💻 CPP
字号:
#include "stdafx.h"

#include "IEImageLib.h"

#include <math.h>

BOOL EdgeGradient(IEFloatImage* pInput, IEFloatImage* pOutput, float sigma)
{
	register int i, j;

	int w = pInput->GetWidth();
	int h = pInput->GetHeight();

	// Dimension check!
	if( w != pOutput->GetWidth() || h != pOutput->GetHeight() )
	{
		return FALSE;
	}

	float a = 1.0f / sigma;

	float** ptr = pInput->GetPixels2D();

	IEFloatImage img_y1;	img_y1.MakeImage(w+4, h+4);	// 葛滴 0栏肺 檬扁拳等促.
	IEFloatImage img_y2;	img_y2.MakeImage(w+4, h+4);
	IEFloatImage img_rx;	img_rx.MakeImage(w+4, h+4);
	IEFloatImage img_ry;	img_ry.MakeImage(w+4, h+4);
	IEFloatImage img_xx;	img_xx.MakeImage(w+4, h+4);

	float** y1 = img_y1.GetPixels2D();
	float** y2 = img_y2.GetPixels2D();
	float** rx = img_rx.GetPixels2D();
	float** ry = img_ry.GetPixels2D();
	float** xx = img_xx.GetPixels2D();

	for( j = 0 ; j < h ; j++ )
	for( i = 0 ; i < w ; i++ )
	{
		xx[j+2][i+2] = ptr[j][i];
	}	

	float t1 = (float)exp(-a);
	float t2 = (float)exp(-2*a);
	float k = (float)((1-t1)*(1-t1)/(1+2*a*t1-t2));

	float a1, a2, a3, a4, a5, a6, a7, a8, c1, c2, b1, b2;

	a1 = 0; a2 = 1 ; a3 = -1 ; a4 = 0;
	a5 = k; a6 = k*t1*(a-1); a7 = k*t1*(a+1); a8 = -k*t2;

	b1 = 2*t1;
	b2 = -t2;

	c1 = -(1-t1)*(1-t1);
	c2 = 1;

	int m, n;

	for( j = 2 ; j < h+2 ; j++ )
	for( i = 2 ; i < w+2 ; i++ )
	{	
		y1[j][i] = a1*xx[j][i] + a2*xx[j][i-1] + b1*y1[j][i-1] + b2*y1[j][i-2];
		n = w - i + 1;
		y2[j][n] = a3*xx[j][n+1] + a4*xx[j][n+2] + b1*y2[j][n+1] + b2*y2[j][n+2];
	}

	for( j = 0 ; j < h+4 ; j++ )
	for( i = 0 ; i < w+4 ; i++ )
	{
		rx[j][i] = c1*(y1[j][i] + y2[j][i]);
	}
	
	for( i = 2 ; i < w+2 ; i++ )
	{
		for( j = 2 ; j < h+2 ; j++ )
		{
			y1[j][i] = a5*rx[j][i] + a6*rx[j-1][i] + b1*y1[j-1][i] + b2*y1[j-2][i];
			m = h - j + 1;
			y2[m][i] = a7*rx[m+1][i] + a8*rx[m+2][i] + b1*y2[m+1][i] + b2*y2[m+2][i];
		}
	}

	for( j = 0 ; j < h+4 ; j++ )
	for( i = 0 ; i < w+4 ; i++ )
	{
		rx[j][i] = y1[j][i] + y2[j][i];
	}

	a1 = k; a2 = k*t1*(a-1); a3 = k*t1*(a+1); a4 = -k*t2;
	a5 = 0; a6 = 1; a7 = -1; a8 = 0;

	c1 = 1;
	c2 = -(1-t1)*(1-t1);

	// b1, b2绰 弊措肺 荤侩
	// b1 = (float)(2*exp(-a));
	// b2 = (float)(-exp(-2*a));
	
	for( j = 2 ; j < h+2 ; j++ )
	for( i = 2 ; i < w+2 ; i++ )
	{	
		y1[j][i] = a1*xx[j][i] + a2*xx[j][i-1] + b1*y1[j][i-1] + b2*y1[j][i-2];
		n = w - i + 1;
		y2[j][n] = a3*xx[j][n+1] + a4*xx[j][n+2] + b1*y2[j][n+1] + b2*y2[j][n+2];
	}

	for( j = 0 ; j < h+4 ; j++ )
	for( i = 0 ; i < w+4 ; i++ )
	{
		ry[j][i] = y1[j][i] + y2[j][i];
	}
	
	for( i = 2 ; i < w+2 ; i++ )
	for( j = 2 ; j < h+2 ; j++ )
	{
		y1[j][i] = a5*ry[j][i] + a6*ry[j-1][i] + b1*y1[j-1][i] + b2*y1[j-2][i];
		m = h - j + 1;
		y2[m][i] = a7*ry[m+1][i] + a8*ry[m+2][i] + b1*y2[m+1][i] + b2*y2[m+2][i];
	}

	for( j = 0 ; j < h+4 ; j++ )
	for( i = 0 ; i < w+4 ; i++ )
	{
		ry[j][i] = y1[j][i] + y2[j][i];
	}
	
	// Output image 积己
	float** out = pOutput->GetPixels2D();
	for( j = 0 ; j < h ; j++ )
	for( i = 0 ; i < w ; i++ )
	{
		out[j][i] = (float)_hypot(rx[j+2][i+2], ry[j+2][i+2]);
	}
	
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -