看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) Win7 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) VS2008 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenCV 問題(Question): 從png檔讀到的pixel無法和原始的影像矩陣完全相同 餵入的資料(Input): png圖檔 預期的正確結果(Expected Output): 原始影像(.raw file) 程式碼(Code): http://ideone.com/PLOrLa https://drive.google.com/drive/folders/0B99YOOHxEH3wMHdnRDZyYkxlZlk?usp=sharing google雲端,裡面有我要處理的png檔和原始影像矩陣的raw file rawfile 大小為2624*1960 16unsighed bit 補充說明(Supplement): 各位版上的大大好: 小魯我最近在研究怎麼把png檔裡的每個像素讀取出來 然後再把像素的值存回RAW檔案 我的對PNG的格式的理解是:非破壞性的壓縮 因此png上的像素值便是原始的像素值 可以透過讀取png影像的每一個pixel,去完整還原原始的raw file DK66.png =>這是我餵入程式圖檔 source_image_array.raw =>這是在拍下png檔時的原始影像資料 66DK.raw =>透過程式產生的影像資料 我的預想是source_image_array.raw要和66DK.raw完全吻合 但是我去觀看source[]矩陣內的資料,卻和source_image_arrat.raw的資料不吻合 以前五個pixel點為例 source_image_array前五點為:016F、0176、016D、016A、0165 但是我透過openCV的cvGet1D抓到的值卻是0131、0134、0136、012A、012E 是因為png工作中的filtering和壓縮後,每一點的像素已經和原始資料不同了嗎? source_image_array.raw這裡面的值是用人工產生的 然後我把source_image_array.raw放進別人寫好的函式轉成PNG檔 我的目的是要將PNG檔還原回我當初製造的source_image_array.raw 用OpenCV中的cvGet1D把PNG檔的所有pixel值紀錄下來 是否可以還原成當初的像素矩陣呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.137.176.70 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1488701223.A.D32.html ※ 編輯: k82817 (223.137.176.70), 03/05/2017 16:11:15
Ommm5566: 作業自己做 03/05 16:09
※ 編輯: k82817 (223.137.176.70), 03/05/2017 16:12:40
k82817: 已經讀取到png的像素值,也寫入進了66DK.raw當中 03/05 16:16
k82817: 如果打開66DK.raw看起來和原始的png檔是一樣的 03/05 16:16
k82817: 想知道為什麼影像看起來正常,但是像素卻不一樣了? 03/05 16:17
Bencrie: 我先猜你 raw 的 y 軸上下顛倒 03/05 16:42
k82817: B大 你是指程式產生的DK66.raw嗎? 03/05 17:11
k82817: 可是我是透過cvGet1D去抓PNG檔第一點的值,應該不會有上下 03/05 17:12
k82817: 影像下方有一個小白點,raw檔看起來正常的 03/05 17:16
k82817: 應該沒有上下顛倒的問題 03/05 17:16
Bencrie: 或者 pixel format 不一樣?RGB BGR ARGB BGRA 03/05 18:04
k82817: 影像為RGB 03/05 19:06
k82817: source_image_array.raw 這個檔案並沒有格式的問題 03/05 19:07
k82817: 在存這個檔案的時候,是將原始矩陣的值直接寫進去 03/05 19:09
k82817: 檔案的前兩個位原組,就是影像的第一個Pixel值 03/05 19:11
Bencrie: 你的 raw 跟我想像中的 raw 好像不一樣 XD 03/05 19:11
k82817: 對,我的RAW檔並不是PS在使用的那種 03/05 19:21
k82817: 他只是單純紀錄每一點的pixel值 03/05 19:22
※ 編輯: k82817 (223.137.176.70), 03/05/2017 19:43:20
Bencrie: 我用 GIMP 開,那兩個 raw 影像不一樣啊 03/05 19:25
Bencrie: 原始那張比較暗,值比較小 03/05 19:26
Bencrie: 你如果怕 OpenCV 幫你做多餘的事情就自己用 libpng 解 03/05 19:30
k82817: B大 你可以告訴你用GIMP打開原始影像時 03/05 19:47
k82817: 前五個像素值是多少嗎? 03/05 19:48
※ 編輯: k82817 (223.137.176.70), 03/05/2017 19:48:59
k82817: 我在想存成PNG檔時,像素的值是不是就已經跑掉 03/05 19:57
k82817: 因為PNG檔的前五個像素就已經和source_image_array不同了 03/05 19:58
FallwinDs: OpenCV 預設值應該是BGR 03/06 14:29
Zero0910: cvLoadImage第二個參數應該要下CV_LOAD_IMAGE_ANYDEPTH 03/06 15:27
Zero0910: 不然OpenCV會把讀進來的影像轉成8bits 03/06 15:27
k82817: zero大 你是說要這要下嗎? 03/06 15:35
k82817: cvLoadImage( filename,CV_LOAD_IMAGE_ANYDEPTH );?? 03/06 15:36
k82817: 因為我去查百度,-1是讀取預設通道 0是轉成灰階 03/06 15:37
k82817: 1是讀取成彩色圖 03/06 15:38
k82817: fall大 所以我去讀取s.Val[0],因為這張png檔並沒做rgb處理 03/06 15:47
k82817: 去讀取s.Val[1]和s.Val[2]都是0 03/06 15:47
k82817: 我想問題應該是出在source image array.raw轉成png的過程 03/06 15:51
k82817: 因為png的pixel已經和source image array.raw完全不相同了 03/06 15:53
k82817: ,可是那是別人的dll檔,無從研究 03/06 15:53
Zero0910: 我手上的文件是寫/* 8 bit, color or gray - deprecated 03/06 15:54
Zero0910: ↑參數下-1的話 03/06 16:01
Zero0910: 我用cvLoadImage( filename,CV_LOAD_IMAGE_ANYDEPTH ); 03/06 16:02
Zero0910: 前幾個pixel是 0x1013 0x4013 0x6013 0xA012 跟你的raw 03/06 16:07
Zero0910: 也不太像就是.. 03/06 16:07
Bencrie: 他的 png 是 16bits grayscale 03/06 17:37
grayStone: 去看官方文件不要看百度 03/06 19:29
TeaEEE: 有color profile嗎? 03/07 13:34
k82817: tea大 是說raw的color profile? 03/08 00:25