我一直在嘗試用特定半徑rs =((int)2.75 * sigma + 0.5)的高斯核函數實現nxn圖像的高斯模糊函數。圍繞圖像邊緣的高斯模糊的「不連續」
for (x=0;x<n;x++){
for (y=0;y<n;y++){
sum=0.0,wsum=0.0;
//Position correction at the edges
if(x-rs<0){
ix=0;
}
else ix=rs;
if(y-rs<0){
iy=0;
}
else iy=rs;
if (x+rs>n-1){
jx=n-1-x;
}
else jx=rs;
if (y+rs>n-1){
jy=n-1-y;
}
else jy=rs;
//Kernel mean value correction at the edges
if (x-rs < 0){
meanx=x+((int)rs/2);
}
else meanx=x;
if(y-rs<0){
meany=y+((int)rs/2);
}
else meany=y;
if (x+rs>n-1){
meanx=x-((int)rs/2);
}
else meanx=x;
if (y+rs>n-1){
meany=y-((int)rs/2);
}
else meany=y;
for (i=x-ix;i<=x+jx;i++){
for (j=y-iy;j<=y+jy;j++){
weight=1/(2*M_PI*sigma*sigma)*exp(-((meanx-i)*(meanx-i)+(meany-j)*(meany-j))/(2*sigma*sigma));
sum+=pic1.intenzity[i][j]*weight;
wsum+=weight;
}
}
pic2->intenzity[x][y]=((int)sum/wsum+0.5);
fprintf(fw,"%d\n",pic2->intenzity[x][y]);
}
當我沒有在邊緣處使用平均值修正的結果是這樣的:
,當我試圖轉移內核的平均值它創建一個間斷也是在圖像的右下方邊緣:
with shifting the mean value to rs/2
我不得不做出邊緣positio n的修正,因爲總和會溢出。現在看來,高斯卷積在某些原因下突然跳躍,當它位於rs和x和y的上邊和左邊時。我想讓它的行爲與它在圖像「內部」中的行爲相同,或者在位置接近邊緣時使強度消失爲0。
我可能會通過rs放大圖像,但它會導致邊緣位置的問題。
感謝您
我沒有看到你的計算有什麼問題,但它可能是一個舍入誤差。如果您將所有數據存儲爲浮點數或雙精度執行計算,則您將轉換爲整數每一步的整數,然後在最後將其舍入到最接近的整數。每次你轉換爲int的方式都有很大的錯誤餘量。 –
我嘗試將sum/wghtsum存儲到單獨的浮點矩陣中,然後再將它寫入int中的像素,但它做了同樣的事情。 – Martin
我指的是你在幾乎每一步都要做的「int」投射。確保所有類型爲double的變量,並刪除每個「(int)」實例,這會在包含重要數據時截斷小數,尤其是因爲您執行了多次計算。你可能會被大量消費。 –