找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
請尊重及感激所有版主付出和奉獻尊貴會員無限看帖不用回覆你準備好成為出色的版主了嗎?
mgcosplayoverlord銀魂中字鬼滅之刃kkbox
アカリと日常生活神奇寶貝天凪青磁おじさんh妹! せ

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

[繁]劇場版 鬼太郎誕

斗破蒼穹 年番 鬥破蒼

花蓮太魯閣因地震造成

(4月新番)[簡]身為魔

[繁]迷宮飯 - 14

【高清繁中】✡ 霹靂
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 2417|回復: 8
打印上一主題下一主題

[問題].raw灰階圖像的影像處理[複製鏈接]

Rank: 1

帖子
237
積分
198 點
潛水值
26390 米
跳轉到指定樓層
樓主
發表於 2016-2-21 05:36 PM|只看該作者|倒序瀏覽
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。
本帖最後由 sank910021 於 2016-2-21 10:56 PM 編輯

現在在做大學的專題,有牽涉到影像處理的部分,我是第一次用c++寫影像處理,所以有一些問題想請教!

程式:

  1. #include <iostream>
  2. #include <fstream>
  3. #define H 512
  4. #define W 512
  5. using namespace std;

  6. int main(){
  7.     fstream input,output;
  8.     unsigned int* Image = new unsigned int[H*W];
  9.     unsigned char* ch = new unsigned char[H*W];
  10.     input.open("LENA.RAW",ios::in | ios::binary);
  11.     if(!input)
  12.     cout << "Load failed!" << endl;
  13.     else{
  14.     input.read((char*)ch,H*W*sizeof(char));
  15.     for(long int h=0;h<H*sizeof(char);h++)
  16.         for(long int w=0;w<W*sizeof(char);w++)
  17.             Image[h*W+w]=int(ch[h*W+w]);
  18.     input.close();

  19.     output.open("LENA2.txt",ios::out | ios::binary);
  20.     for(long int h=0;h<H*sizeof(char);h++){
  21.         for(long int w=0;w<W*sizeof(char);w++){
  22.             output << Image[h*W+w] << " ";
  23.             if(w == W-1)
  24.                 output << endl;
  25.         }
  26.     }
  27.     output.close();
  28. }
  29. return 0;
  30. }
複製代碼
上面主要是將灰階的.raw檔案(LENA.RAW)的數值存入整數陣列中,範圍以灰階圖片來說應該是0~255,輸出後到.txt也都沒超出範圍

我想問的是在 "Image[h*W+w]=int(ch[h*W+w]);" 這行中,為何ch不必經過ASCII轉換呢?

另外如果有哪邊可以改進的部分也請各位大大指正出來,謝謝!
...
瀏覽完整內容,請先 註冊登入會員
分享分享0收藏收藏0支持支持0
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。

使用道具檢舉

  尊貴會員

Melty Snow  雪靈

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
3222
積分
24364 點
潛水值
77170 米
頭香
發表於 2016-2-21 07:53 PM|只看該作者
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php
ch 只是當作 byte[] 使用吧
裡面存放的是二進位代表的整數值
不是 char 印出的文字

點評

sank910021 之後有有好好思考過了,以前都是把char當作字元使用,也沒必要用ASCII轉換(以前常用字元轉整數,完全搞混了),謝謝回復!  發表於 2016-2-24 11:09 PM
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。

使用道具檢舉

Rank: 2Rank: 2

帖子
274
積分
373 點
潛水值
8890 米
3
發表於 2016-2-24 09:19 PM|只看該作者
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php
底下兩行
  1.     for(long int h=0;h<H*sizeof(char);h++)
  2.         for(long int w=0;w<W*sizeof(char);w++)
複製代碼

不能那樣寫,要改成
  1.     for(long int h=0;h<H;h++)
  2.         for(long int w=0;w<W;w++)
複製代碼


...
瀏覽完整內容,請先 註冊登入會員

點評

sank910021 了解,*sizeof(char)的確沒有必要...因為是1XD,謝謝回覆!  發表於 2016-2-24 11:13 PM

使用道具檢舉

Rank: 2Rank: 2

帖子
274
積分
373 點
潛水值
8890 米
4
發表於 2016-2-24 11:44 PM|只看該作者
本帖最後由 a333221 於 2016-2-24 11:48 PM 編輯

sank910021, 

和 sizeof(char) == 1 沒有關係,從邏輯上來說,*sizeof(char) 是不該存在的,

倘若 for 迴圈就是長 for(long int h=0;h<H*sizeof(char);A) 這樣,

那 A 也應該是 h+= sizeof(char),而非 ++h,

你可以將你 code 裡 22、23 行的 sizeof(char) 替換成 sizeof(unsigned int),

...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

inunu 該用戶已被刪除
5
發表於 2016-2-26 10:28 AM|只看該作者
一般的影像處理會先定義一個資料結構來描述 pixel

其次, 沒有必要輸入輸出各跑自己的雙層夾心迴圈
摻在一起做成撒尿牛丸就行了
因此兩個 2D array 也沒有存在必要

我比較偏向這樣的精簡寫法
通常是要進行縮放, blur 或其它有資料相依性的處理才會讀全圖

  1. typedef struct
  2. {
  3.     unsigned char gray;
  4. } PIXEL;

  5. int main(int argc, char *argv[])
  6. {
  7.     fstream input;
  8.     fstream output;
  9.     int x = 0;
  10.     int y = 0;

  11.     input.open("LENA1.raw", ios::in | ios::binary);
  12.     output.open("LENA2.txt", ios::out);

  13.     while(!input.eof())
  14.     {
  15.         PIXEL pixel;
  16.         input.read((char *)&pixel, sizeof(PIXEL));
  17.         output << (int)pixel.gray << ' ';

  18.         x++;
  19.         if (x >= W)
  20.         {
  21.             output << endl;
  22.             x = 0;
  23.             y++;
  24.             if (y >= H)
  25.             {
  26.                 break;
  27.             }
  28.         }
  29.     }

  30.     input.close();
  31.     output.close();

  32.     return 0;
  33. }
複製代碼

...
瀏覽完整內容,請先 註冊登入會員





使用道具檢舉

  小學生(200/1000)

孤單落葉

Rank: 2Rank: 2

帖子
301
積分
309 點
潛水值
23062 米
6
發表於 2016-2-26 04:58 PM|只看該作者
如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。
inunu 好強阿!!
小弟弟我也在剛好在學習從RAW DATA中轉換成 圖片
但小弟我 學識太淺...
看到inunu 大大的寫法已經精簡到 我有點看不懂了OTZ
要不是搭配樓主的寫法我只能看懂30%
慚愧慚愧~"~
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。

使用道具檢舉

Rank: 4Rank: 4Rank: 4Rank: 4

帖子
7565
積分
4321 點
潛水值
34960 米
7
發表於 2016-2-28 12:32 AM|只看該作者
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。
本帖最後由 chevylin0802 於 2016-2-28 12:38 AM 編輯
a333221 發表於 2016-2-24 11:44 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

sank910021, 

和 sizeof(char) == 1 沒有關係,從邏輯上來說,*sizeof(char) 是不該存在的,
...
瀏覽完整內容,請先 註冊登入會員
系統已重置禁訪用戶到普通用戶和密碼一次
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。

使用道具檢舉

Rank: 2Rank: 2

帖子
274
積分
373 點
潛水值
8890 米
8
發表於 2016-2-28 01:05 PM|只看該作者
如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。
chevylin0802 發表於 2016-2-28 12:32 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

sizeof(char)回傳為1是確定的
而且也不應該講它不該存在
而是該說不應該那樣子使用

sank910021 的 code 是這麼寫:
...
瀏覽完整內容,請先 註冊登入會員
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。

使用道具檢舉

Rank: 4Rank: 4Rank: 4Rank: 4

帖子
7565
積分
4321 點
潛水值
34960 米
9
發表於 2016-2-28 01:58 PM 來自手機|只看該作者
如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。
本帖最後由 chevylin0802 於 2016-2-28 03:08 PM 編輯
a333221 發表於 2016-2-28 01:05 PM
sank910021 的 code 是這麼寫:



他也只是個新手
當然寫法會比較直觀
複雜一點的程式邏輯
沒那麼快學會
那需要靠經驗磨煉

不過至少我個人不會喜歡用C++的寫法
...
瀏覽完整內容,請先 註冊登入會員
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部