はじめまして、じみっちぃと申します。
いま、とあるサイトに公開されているJAVAプログラムをAB向けに移植しようとしています。
内容は、画像のフィルタリングプログラムなのですが、
JAVAプログラムを自分なりに解析し、ABに書き直してみました。
ところがどうしてもうまく動かず、みなさんのお知恵を拝借できたらと思い
投稿させていただきました。
症状として、なぜかほぼ真っ白な状態になってしまうのです。
JAVAの上では、問題なく動いていたので、アルゴリズムに問題があるとは思えず…
お手数ですが、何かヒントになりそうなことがありましたらご教授いただけませんでしょうか。
よろしくお願いいたします。
移植元のプログラム(JAVA言語)
[ここをクリックすると内容が表示されます]
コード: 全て選択
public class FilterMultiplexscale1 extends Filter
{
public FilterMultiplexscale1()
{
windowSize = 5;
windowSizeMax = 35;
windowSizeMin = 1;
SIGMA = Math.pow(2D, -3D);
SIGMAMax = 1000D;
SIGMAMin = 0.0001D;
I = 16;
SIGMA2 = new double;
offset = (windowSize - 1) / 2;
ND = new double[offset * 2 + 1][offset * 2 + 1];
}
void weight(int i)
{
int j = offset * 2 + 1;
double ad[] = new double[j];
SIGMA2 = Math.sqrt(Math.pow(2D, i - 3));
double d = 1.0D / Math.sqrt(6.2831853071795862D) / SIGMA2;
double d1 = 0.0D;
for(int k = 0; k < j; k++)
{
double d2 = k - offset;
ad[k] = d / Math.exp((d2 * d2) / (2D * SIGMA2 * SIGMA2));
d1 += ad[k];
}
for(int l = 0; l < j; l++)
ad[l] /= d1;
for(int i1 = 0; i1 < j; i1++)
{
for(int j1 = 0; j1 < j; j1++)
ND[i1][j1] = ad[i1] * ad[j1];
}
}
public void filter(AnimatedImage animatedimage)
{
for(int i = 0; i < I; i++)
weight(i);
double d = Math.sqrt(Math.pow(2D, 11D));
double d1 = Math.sqrt(Math.sqrt(Math.sqrt(Math.sqrt(2D))));
double ad[] = new double;
double ad1[] = new double;
double ad2[] = new double;
double ad3[] = new double[I];
double ad4[] = new double[I];
double ad5[] = new double[I];
double ad6[] = new double[I];
double ad7[] = new double[I];
double ad8[] = new double[I];
double d4 = 0.0D;
double d5 = 0.0D;
double d6 = 0.0D;
double d7 = 0.5D;
double d8 = 1.0D;
char c = '\310';
char c1 = '\310';
char c2 = '\310';
for(int j = 0; j < animatedimage.getHeight(); j++)
{
for(int k = 0; k < animatedimage.getWidth(); k++)
{
for(int l = 0; l < I; l++)
{
double d2 = ad[l] = ad1[l] = ad2[l] = 0.0D;
}
for(int i1 = 0; i1 < I; i1++)
ad5[i1] = ad6[i1] = ad7[i1] = 0.0D;
label0:
for(int j1 = 0; j1 < I; j1++)
{
double d3 = 0.0D;
if(k - offset < 0 || k + offset >= animatedimage.getWidth() || j - offset < 0 || j + offset >= animatedimage.getHeight())
{
for(int j2 = -offset; j2 <= offset; j2++)
{
for(int l2 = -offset; l2 <= offset; l2++)
if(k + j2 >= 0 && k + j2 < animatedimage.getWidth() && j + l2 >= 0 && j + l2 < animatedimage.getHeight())
{
d3 += ND[j1][j2 + offset][l2 + offset];
ad[j1] += (double)animatedimage.getR(k + j2, j + l2) * ND[j1][j2 + offset][l2 + offset];
ad1[j1] += (double)animatedimage.getG(k + j2, j + l2) * ND[j1][j2 + offset][l2 + offset];
ad2[j1] += (double)animatedimage.getB(k + j2, j + l2) * ND[j1][j2 + offset][l2 + offset];
}
}
ad[j1] /= d3;
ad1[j1] /= d3;
ad2[j1] /= d3;
continue;
}
int k2 = -offset;
do
{
if(k2 > offset)
continue label0;
for(int i3 = -offset; i3 <= offset; i3++)
{
ad[j1] += (double)animatedimage.getR(k + k2, j + i3) * ND[j1][k2 + offset][i3 + offset];
ad1[j1] += (double)animatedimage.getG(k + k2, j + i3) * ND[j1][k2 + offset][i3 + offset];
ad2[j1] += (double)animatedimage.getB(k + k2, j + i3) * ND[j1][k2 + offset][i3 + offset];
}
k2++;
} while(true);
}
for(int k1 = 0; k1 < I; k1++)
if(k1 <= 2)
ad3[k1] = 0.0D;
else
ad3[k1] = d / Math.sqrt(Math.pow(2D, (k1 + 1) - 3));
for(int l1 = 0; l1 < I - 1; l1++)
{
ad5[l1] = ad[l1 + 1] - ad[l1];
ad6[l1] = ad1[l1 + 1] - ad1[l1];
ad7[l1] = ad2[l1 + 1] - ad2[l1];
}
for(int i2 = 0; i2 < I - 1; i2++)
{
d4 += ad5[i2] * ad3[i2];
d5 += ad6[i2] * ad3[i2];
d6 += ad7[i2] * ad3[i2];
}
d4 = d4 + d8 + ad[14];
d5 = d5 + d8 + ad1[14];
d6 = d6 + d8 + ad2[14];
d4 = gethanni(d4);
d5 = gethanni(d5);
d6 = gethanni(d6);
animatedimage.setRGB(k, j, (int)Math.rint(d4), (int)Math.rint(d5), (int)Math.rint(d6));
}
switchThread();
}
switchThread();
animatedimage.repaintAll();
}
移植後のプログラム(AB言語)
[ここをクリックすると内容が表示されます]
コード: 全て選択
Sub Filter(hDC_Target As HDC, nWidth As Long, nHeight As Long) As Long
Dim nSize As Long
Dim hHeapEA As HANDLE
Dim hHeapEB As HANDLE
Dim hHeapEC As HANDLE
'Dim ND As DWordPtr
Dim ND As DoublePtr
Dim dwSrcBits As DWordPtr
Dim dwDstBits As DWordPtr
Dim windowSize As Integer
Dim windowSizeMax As Integer
Dim windowSizeMin As Integer
Dim SIGMA As Integer
Dim SIGMAMax As Integer
Dim SIGMAMin As Integer
Dim I As Integer
Dim offset As Integer
Dim i As Long
Dim j As Long
Dim adAA(17) As Double
Dim ad(17) As Integer
Dim adA(17) As Integer
Dim adB(17) As Integer
Dim adC(17) As Integer
'Dim adD(17) As Long
Dim adE(17) As Integer
Dim adF(17) As Integer
Dim adG(17) As Integer
'Dim adH(17) As Long
Dim SigmaB(17) As Double
Dim d As Double
Dim dA As Long
Dim k As Long
Dim dB As Single
Dim l As Integer
Dim iA As Long
Dim jA As Long
Dim dD As Integer
Dim dE As Integer
Dim dF As Integer
Dim dH As Integer
Dim dC As Integer
Dim jB As Integer
Dim lB As Integer
Dim kB As Integer
Dim iC As Integer
Dim kA As Integer
Dim lA As Integer
Dim iB As Integer
Dim tmpLogA As Double
'Const Pi = 3.14159265358979323846264
'Const PiPi = Pi * Pi
Const PiPi = 6.2831853071795862
nSize = nWidth * nHeight
hHeapEB = HeapCreate( NULL, 0, 0 )
dwSrcBits = HeapAlloc( hHeapEB, HEAP_ZERO_MEMORY, nSize*4 )
hHeapEC = HeapCreate( NULL, 0, 0 )
dwDstBits = HeapAlloc( hHeapEB, HEAP_ZERO_MEMORY, nSize*4 )
For y = 0 To nHeight - 1
For x = 0 To nWidth - 1
dwSrcBits[y*nWidth + x] = GetPixel(hDC_Target, x, y)
Next x
Next y
windowSize = 7
windowSizeMax = 35
windowSizeMin = 1
SIGMA = 2^(-3)
SIGMAMax = 1000
SIGMAMin = 0.0001
I = 16
offset = (windowSize - 1) / 2
hHeapEA = HeapCreate(NULL, 0, 0)
ND = HeapAlloc(hHeapEA, HEAP_ZERO_MEMORY, RGB(255,255,255)*SizeOf(Double))
d = Sqr(2^11)
dA = Sqr(Sqr(Sqr(Sqr(2))))
For i = 0 To (I-1)
j = (offset * 2) + 1
SigmaB(i) = Sqr( 2^(i-3) )
d = 1 / Sqr(PiPi) / SigmaB(i)
dA = 0
For k = 0 To j-1
dB = (k - offset) * (k - offset)
tmpLogA = dB / (2 * SigmaB(i) * SigmaB(i))
adAA(k) = d / Exp(tmpLogA)
dA += adAA(k)
Next k
For l = 0 To j-1
adAA(l) /= dA
Next l
For iA = 0 To j-1
For jA = 0 To j-1
ND[RGB(i,iA,jA)] = adAA(iA) * adAA(jA)
Next jA
Next iA
Next i
dD = 0
dE = 0
dF = 0
'dG = 0.5
dH = 1
For j = 0 To nHeight-1
For k = 0 To nWidth-1
For l = 0 To I-1
dB = 0
ad(l) = 0
adA(l) = 0
adB(l) = 0
adE(l) = 0
adF(l) = 0
adG(l) = 0
Next l
For jA = 0 To I-1
dC = 0
If (((k - offset < 0) Or (k + offset >= nWidth)) Or ((j - offset < 0) Or (j + offset >= nHeight))) Then
For jB = 0-offset To offset
For lB = 0-offset To offset
If((((k+jB) >= 0) And ((k+jB) < nWidth)) And (((j+lB) >= 0) And ((j+lB) < nHeight))) Then
dC += (ND[RGB(jA,(jB+offset),(lB+offset))])
ad(jA) += (GetRed(dwSrcBits[((j+lB)*nWidth) + (k+jB)]) * ND[RGB(jA,(jB+offset),(lB+offset))])
adA(jA) += (GetGreen(dwSrcBits[((j+lB)*nWidth) + (k+jB)]) * ND[RGB(jA,(jB+offset),(lB+offset))])
adB(jA) += (GetBlue(dwSrcBits[((j+lB)*nWidth) + (k+jB)]) * ND[RGB(jA,(jB+offset),(lB+offset))])
End If
Next lB
Next jB
ad(jA) /= dC
adA(jA) /= dC
adB(jA) /= dC
'Continue
Else
For kB = (0-offset) To offset
For iC = 0-offset To offset
ad(jA) += (GetRed(dwSrcBits[((j+iC)*nWidth) + (k+kB)]) * ND[RGB(jA,(kB+offset),(iC+offset))])
adA(jA) += (GetGreen(dwSrcBits[((j+iC)*nWidth) + (k+kB)]) * ND[RGB(jA,(kB+offset),(iC+offset))])
adB(jA) += (GetBlue(dwSrcBits[((j+iC)*nWidth) + (k+kB)]) * ND[RGB(jA,(kB+offset),(iC+offset))])
Next iC
Next kB
End If
Next jA
For kA = 0 To I-1
If kA <= 2 Then
adC(kA) = 0
Else
adC(kA) = d / Sqr(2^((kA+1)-3))
End If
adE(kA) = ad((kA + 1)) - ad(kA)
adF(kA) = adA((kA + 1)) - adA(kA)
adG(kA) = adB((kA + 1)) - adB(kA)
dD += (adE(kA) * adC(kA))
dE += (adF(kA) * adC(kA))
dF += (adG(kA) * adC(kA))
Next kA
dD = BInt(dD + dH + ad[14])
dE = BInt(dE + dH + adA[14])
dF = BInt(dF + dH + adB[14])
'animatedimage.setRGB(k, j, (int)Math.rint(dD), (int)Math.rint(dE), (int)Math.rint(dF));
dwDstBits[j*nWidth + k] = RGB(Int(dD),Int(dE),Int(dF))
Next k
Next j
For y = 0 To nHeight - 1
For x = 0 To nWidth - 1
SetPixelV(hDC_Target, x, y, dwDstBits[y*nWidth + x])
Next x
Next y
InvalidateRect(hMainWnd, ByVal 0, TRUE)
End Sub
Function BInt(lngNo As Long) As Long
If lngNo > 255 Then
BInt = 255
ElseIf lngNo < 0 Then
BInt = 0
Else
BInt = lngNo
End If
End Function
Function GetRed(iColor As Long) As Long
GetRed = &HFF And iColor
End Function
Function GetGreen(iColor As Long) As Long
GetGreen = (&HFF00 And iColor) \ 256
End Function
Function GetBlue(iColor As Long) As Long
GetBlue = (&HFF0000 And iColor) \ 65536
End Function