c語言數字影象處理(八):噪聲模型及均值濾波器
影象退化/復原過程模型
高斯噪聲
PDF(概率密度函式)
生成高斯隨機數序列
演算法可參考<http://www.doc.ic.ac.uk/~wl/papers/07/csur07dt.pdf>
程式碼實現
1 double gaussrand() 2 { 3static double V1, V2, S; 4static int phase = 0; 5double X; 6 7if(phase == 0) { 8do { 9double U1 = (double)rand() / RAND_MAX; 10double U2 = (double)rand() / RAND_MAX; 11 12V1 = 2 * U1 - 1; 13V2 = 2 * U2 - 1; 14S = V1 * V1 + V2 * V2; 15} while(S >= 1 || S == 0); 16 17X = V1 * sqrt(-2 * log(S) / S); 18} else 19X = V2 * sqrt(-2 * log(S) / S); 20 21phase = 1 - phase; 22 23return X * 50; 24 }
生成高斯噪聲圖及直方圖
下面給一幅圖新增高斯噪聲
程式碼實現
1 void add_gaussian_noise(short** in_array, short** out_array, long height, long width) 2 { 3srand(time(NULL)); 4for (int i = 0; i < height; i++){ 5for (int j = 0; j < width; j++){ 6out_array[i][j] = in_array[i][j] + (short)gaussrand(); 7if (out_array[i][j] < 0x00) 8out_array[i][j] = 0x00; 9else if (out_array[i][j] > 0xff) 10out_array[i][j] = 0xff; 11} 12} 13 }
原圖
新增高斯噪聲
椒鹽噪聲
新增椒鹽噪聲(胡椒噪聲和鹽粒噪聲概率分別為5%)
1 void add_salt_pepper_noise(short** in_array, short** out_array, long height, long width) 2 { 3srand(time(NULL)); 4int noise_p; 5 6for (int i = 0; i < height; i++){ 7for (int j = 0; j < width; j++){ 8noise_p = rand() % 10; 9if (noise_p == 0){ 10int temp = rand() % 2; 11if (temp) 12out_array[i][j] = 0x00; 13else 14out_array[i][j] = 0xff; 15} 16else 17out_array[i][j] = in_array[i][j]; 18} 19} 20 }
均值濾波器
算術均值濾波器
程式碼實現
1 int is_in_array(short x, short y, short height, short width) 2 { 3if (x >= 0 && x < width && y >= 0 && y < height) 4return 1; 5else 6return 0; 7 } 8 9 /* 10* element 11* v0v1v2 12* v3v4v5 13* v6v7v8 14* 15*/ 16 void filtering(short** in_array, short** out_array, long height, long width) 17 { 18short value[9]; 19 20for (int i = 0; i < height; i++){ 21for (int j = 0; j < width; j++){ 22value[0] = is_in_array(j-1, i-1, height, width) ? in_array[i-1][j-1] : 0; 23value[1] = is_in_array(j, i-1, height, width) ? in_array[i-1][j] : 0; 24value[2] = is_in_array(j+1, i-1, height, width) ? in_array[i-1][j+1] : 0; 25value[3] = is_in_array(j-1, i, height, width) ? in_array[i][j-1] : 0; 26value[4] = in_array[i][j]; 27value[5] = is_in_array(j+1, i, height, width) ? in_array[i][j+1] : 0; 28value[6] = is_in_array(j-1, i+1, height, width) ? in_array[i+1][j-1] : 0; 29value[7] = is_in_array(j, i+1, height, width) ? in_array[i+1][j] : 0; 30value[8] = is_in_array(j+1, i+1, height, width) ? in_array[i+1][j+1] : 0; 31 32/* Arithmetic Mean Filter */ 33for (int k = 0; k < ARRAY_SIZE*ARRAY_SIZE; k++) 34out_array[i][j] += value[k]; 35out_array[i][j] /= ARRAY_SIZE*ARRAY_SIZE; 36 37} 38} 39 }
處理高斯噪聲
處理椒鹽噪聲
結論:算術平均濾波對於高斯噪聲和椒鹽噪聲都有一定的效果,但是同時會平滑影象
幾何均值濾波器
實現
1 void filtering(short** in_array, short** out_array, long height, long width) 2 { 3short value[9]; 4 5for (int i = 0; i < height; i++){ 6for (int j = 0; j < width; j++){ 7value[0] = is_in_array(j-1, i-1, height, width) ? in_array[i-1][j-1] : 0; 8value[1] = is_in_array(j, i-1, height, width) ? in_array[i-1][j] : 0; 9value[2] = is_in_array(j+1, i-1, height, width) ? in_array[i-1][j+1] : 0; 10value[3] = is_in_array(j-1, i, height, width) ? in_array[i][j-1] : 0; 11value[4] = in_array[i][j]; 12value[5] = is_in_array(j+1, i, height, width) ? in_array[i][j+1] : 0; 13value[6] = is_in_array(j-1, i+1, height, width) ? in_array[i+1][j-1] : 0; 14value[7] = is_in_array(j, i+1, height, width) ? in_array[i+1][j] : 0; 15value[8] = is_in_array(j+1, i+1, height, width) ? in_array[i+1][j+1] : 0; 16 17/* Geometric Mean Filter */ 18double product = 1.0; 19for (int k = 0; k < ARRAY_SIZE*ARRAY_SIZE; k++) 20product *= value[k]; 21product = pow(product, 1.0 / 9.0); 22out_array[i][j] = (short)product; 23 24if (out_array[i][j] < 0x00) 25out_array[i][j] = 0x00; 26else if (out_array[i][j] > 0xff) 27out_array[i][j] = 0xff; 28} 29} 30 }
幾何均值濾波器與算術均值濾波器相比,丟失的影象細節更少
諧波均值濾波器
實現
1 void filtering(short** in_array, short** out_array, long height, long width) 2 { 3short value[9]; 4 5for (int i = 0; i < height; i++){ 6for (int j = 0; j < width; j++){ 7value[0] = is_in_array(j-1, i-1, height, width) ? in_array[i-1][j-1] : 0; 8value[1] = is_in_array(j, i-1, height, width) ? in_array[i-1][j] : 0; 9value[2] = is_in_array(j+1, i-1, height, width) ? in_array[i-1][j+1] : 0; 10value[3] = is_in_array(j-1, i, height, width) ? in_array[i][j-1] : 0; 11value[4] = in_array[i][j]; 12value[5] = is_in_array(j+1, i, height, width) ? in_array[i][j+1] : 0; 13value[6] = is_in_array(j-1, i+1, height, width) ? in_array[i+1][j-1] : 0; 14value[7] = is_in_array(j, i+1, height, width) ? in_array[i+1][j] : 0; 15value[8] = is_in_array(j+1, i+1, height, width) ? in_array[i+1][j+1] : 0; 16 17/* Harmonic Mean Filter */ 18double sum = 0; 19for (int k = 0; k < ARRAY_SIZE*ARRAY_SIZE; k++) 20sum += 1.0 / value[k]; 21out_array[i][j] = (short)(9.0 / sum); 22 23if (out_array[i][j] < 0x00) 24out_array[i][j] = 0x00; 25else if (out_array[i][j] > 0xff) 26out_array[i][j] = 0xff; 27} 28} 29 }
處理高斯噪聲
處理椒鹽噪聲
對鹽粒噪聲效果較好,不適用於胡椒噪聲,善於處理高斯噪聲
逆諧波均值濾波器
Q為濾波器的階數,Q為正時,消除胡椒噪聲,Q為負時消除鹽粒噪聲
Q=0為算術均值濾波器,Q=-1諧波均值濾波器
實現
1 void filtering(short** in_array, short** out_array, long height, long width) 2 { 3short value[9]; 4 5for (int i = 0; i < height; i++){ 6for (int j = 0; j < width; j++){ 7value[0] = is_in_array(j-1, i-1, height, width) ? in_array[i-1][j-1] : 0; 8value[1] = is_in_array(j, i-1, height, width) ? in_array[i-1][j] : 0; 9value[2] = is_in_array(j+1, i-1, height, width) ? in_array[i-1][j+1] : 0; 10value[3] = is_in_array(j-1, i, height, width) ? in_array[i][j-1] : 0; 11value[4] = in_array[i][j]; 12value[5] = is_in_array(j+1, i, height, width) ? in_array[i][j+1] : 0; 13value[6] = is_in_array(j-1, i+1, height, width) ? in_array[i+1][j-1] : 0; 14value[7] = is_in_array(j, i+1, height, width) ? in_array[i+1][j] : 0; 15value[8] = is_in_array(j+1, i+1, height, width) ? in_array[i+1][j+1] : 0; 16 17/* Contra-Harmonic Mean Filter */ 18int Q = 2; 19double num = 0.0, den = 0.0; 20for (int k = 0; k < ARRAY_SIZE*ARRAY_SIZE; k++){ 21num += pow(value[k], Q+1); 22den += pow(value[k], Q); 23} 24out_array[i][j] = (short)(num / den); 25 26if (out_array[i][j] < 0x00) 27out_array[i][j] = 0x00; 28else if (out_array[i][j] > 0xff) 29out_array[i][j] = 0xff; 30} 31} 32 }
Q = 2 消除胡椒噪聲
Q = -2消除鹽粒噪聲
Q = -2消除鹽粒噪聲後的影象使用Q = 2消除胡椒噪聲
再來一次
再來
此時椒鹽噪聲已經基本消除