📄 ieimageedge.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 + -