[問題] BCB影像處理雜訊

看板C_and_CPP作者 (髍鵀)時間15年前 (2009/04/10 23:36), 編輯推噓5(5019)
留言24則, 3人參與, 最新討論串1/3 (看更多)
各位板友好 小弟是剛學影像處理的新手 目前在研究雜訊程式碰到了許多問題 雖然有對照書本寫的雜訊公式來看 可是還是不知道以下三段程式是怎麼做加入雜訊運算 首先是Impulse noise的部份 level值算是強度嗎?那麼它有特定範圍嗎? 在這段程式裡有寫到pix = cp*x cp是定義的色平面,那將它乘以x可以得到什麼? 再者是Gaussian noise _ 書本寫高斯雜訊為p(z)=((1/2^0.5)*標準差)*e^(-(z-z)^2)/2*標準差^2 可是對照下面的程式 一開始定義的mean和sd是什麼? 然後在程式裡的運算 sqrt12和sqrt10是代表什麼?是要再另外定義它成為某個數字還是??? 我真的不太清楚這樣的寫法跟書本的公式有什麼關聯性 如果有板友了解的話可以幫我解惑嗎 最後是Uniform Noise的部份 一樣是不清楚公式跟程式的關連性... 雖然說mean和sd是要輸入的值 可是他們主要是代表控制什麼? 然後在迴圈裡的ran到sum3=...應該是在計算p(z) 可是我研究許久還是不懂到底程式是怎麼表達p(z)... (Impulse Noise) prob = StrToInt(Form11->Edit1->Text); level = StrToInt(Form11->Edit2->Text); randomize(); for (int y = 0;y < nBitmap->Height;y++) { aptr = (Byte*)nBitmap->ScanLine[y]; for (int x = 0;x < nBitmap->Width;x++) if (random(100) <= prob) { pix1 = cp * x; aptr[pix1] = (Byte)(aptr[pix1]+level); aptr[pix1+1] = (Byte)(aptr[pix1+1]+level); aptr[pix1+2] = (Byte)(aptr[pix1+2]+level); } } (Gaussian Noise) mean = StrToInt(Form11->Edit1->Text); sd = StrToFloat(Form11->Edit2->Text); //ShowMessage("Mean = "+IntToStr(mean)+",\nSD ="+FloatToStr(sd)+"."); randomize(); for (int y = 0;y < nBitmap->Height;y++) { aptr = (Byte*)nBitmap->ScanLine[y]; for (int x = 0;x < nBitmap->Width;x++) { total = 0.0; for (int k = 0;k < 10;k++) { ran = (float)(random(100)+1) / 100; total += (float)sqrt12 * sd * (ran - 0.5); } total /= (float)sqrt10; total += (float)mean; pix1 = cp * x; sum1 = total+(float)aptr[pix1]; sum2 = total+(float)aptr[pix1+1]; sum3 = total+(float)aptr[pix1+2]; if (sum1 < 0.0) sum1 = 0.0; if (sum2 < 0.0) sum2 = 0.0; if (sum3 < 0.0) sum3 = 0.0; aptr[pix1] = (Byte)(sum1); aptr[pix1+1] = (Byte)(sum2); aptr[pix1+2] = (Byte)(sum3); } } (Uniform Noise) mean = StrToInt(Form11->Edit1->Text); sd = StrToFloat(Form11->Edit2->Text); randomize(); for (int y = 0;y < nBitmap->Height;y++) { aptr = (Byte*)nBitmap->ScanLine[y]; for (int x = 0;x < nBitmap->Width;x++) { ran = (float)(random(100)+1) / 100; total = ran - 0.5; total *= (float)sqrt12; total *= sd; total += (float)mean; pix1 = cp * x; sum1 = total+(float)aptr[pix1]; sum2 = total+(float)aptr[pix1+1]; sum3 = total+(float)aptr[pix1+2]; if (sum1 < 0.0) sum1 = 0.0; if (sum2 < 0.0) sum2 = 0.0; if (sum3 < 0.0) sum3 = 0.0; aptr[pix1] = (Byte)(sum1); aptr[pix1+1] = (Byte)(sum2); aptr[pix1+2] = (Byte)(sum3); } } 以上幾個問題煩請板友幫小弟解惑 不好意思一次問太多問題了... 小弟僅能盡量以微薄的P幣答謝回答問題的板友 感謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.74.245.166

04/10 23:52, , 1F
你這些問題應該是影像處理,不是程式
04/10 23:52, 1F

04/10 23:53, , 2F
給你一個提示,sqrt應該是mask resolution
04/10 23:53, 2F

04/10 23:54, , 3F
再不懂,告訴你一個以一而貫之的原則,所有的去雜訊
04/10 23:54, 3F

04/10 23:55, , 4F
都是用旁邊來算中間,求得的直,都是你中央的去雜訊質
04/10 23:55, 4F

04/11 00:09, , 5F
如果只是想在圖中加入雜訊 那麼sqrt是mask resolution嗎?
04/11 00:09, 5F

04/11 00:32, , 6F
原po的問題是要如何在影像內加入雜訊........:)
04/11 00:32, 6F

04/11 00:35, , 7F
不是, 去雜訊和加入雜訊兩者基本上用的方法不同....
04/11 00:35, 7F

04/11 00:36, , 8F
我不知道你的code貼出來是你寫的還是reference的....
04/11 00:36, 8F

04/11 00:36, , 9F
但是mean應該是平均值, sd是標準差, 這兩個值是產生其
04/11 00:36, 9F

04/11 00:37, , 10F
中一種雜訊會使用到的, 如果code是你寫的應該不會不知.
04/11 00:37, 10F

04/11 00:37, , 11F
如果code是reference的找一下有沒有作者註解或說明文件
04/11 00:37, 11F

04/11 00:38, , 12F
是reference的 我想先搞懂別人怎麼撰寫 可是一直碰壁...
04/11 00:38, 12F

04/11 00:39, , 13F
找個有註解的看吧Orz 另外, 變數mean和sd這兩個如果是看
04/11 00:39, 13F

04/11 00:40, , 14F
原文書的話, 應該要可以聯想到是平均數與標準差啊XD
04/11 00:40, 14F

04/11 00:40, , 15F
因為沒有註解 所以只能慢慢摸索 感謝a大和V大回我的問題
04/11 00:40, 15F

04/11 00:42, , 16F
嗯嗯 我認為那是平均數和標準差 但看程式的寫法又不太懂
04/11 00:42, 16F

04/11 00:48, , 17F
不太確定是不是code不完整, sqrt##好像沒交代怎麼來的.y
04/11 00:48, 17F

04/11 00:55, , 18F
對照公式後 sqrt我有想過是不是要自己定義某個值
04/11 00:55, 18F

04/11 02:51, , 19F
sqrt要怎麼定義我大概想通了...弄真久
04/11 02:51, 19F

04/11 10:07, , 20F
果然想睡眼會昏,我沒仔細看原po想去雜訊還是加雜訊
04/11 10:07, 20F

04/11 10:09, , 21F
不過我研究的時候只需要去雜訊,加雜訊這都是上課作業
04/11 10:09, 21F

04/11 10:10, , 22F
你上網查一下就一堆方法了,那些關鍵字高斯,impluse,uniform
04/11 10:10, 22F

04/11 10:11, , 23F
方法都大同小異,只有計算會有不同,每個人想強調的地方不同
04/11 10:11, 23F

04/11 10:12, , 24F
影像處裡就是這樣,重點是你要拿來做什麼
04/11 10:12, 24F
文章代碼(AID): #19tsUIQZ (C_and_CPP)
文章代碼(AID): #19tsUIQZ (C_and_CPP)