[問題] OpenCV讀取png圖檔的每個pixel

看板C_and_CPP作者 (ken)時間8年前 (2017/03/05 16:07), 8年前編輯推噓10(11133)
留言45則, 7人參與, 最新討論串1/1
開發平台(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

03/05 16:09, , 1F
作業自己做
03/05 16:09, 1F
※ 編輯: k82817 (223.137.176.70), 03/05/2017 16:12:40

03/05 16:16, , 2F
已經讀取到png的像素值,也寫入進了66DK.raw當中
03/05 16:16, 2F

03/05 16:16, , 3F
如果打開66DK.raw看起來和原始的png檔是一樣的
03/05 16:16, 3F

03/05 16:17, , 4F
想知道為什麼影像看起來正常,但是像素卻不一樣了?
03/05 16:17, 4F

03/05 16:42, , 5F
我先猜你 raw 的 y 軸上下顛倒
03/05 16:42, 5F

03/05 17:11, , 6F
B大 你是指程式產生的DK66.raw嗎?
03/05 17:11, 6F

03/05 17:12, , 7F
可是我是透過cvGet1D去抓PNG檔第一點的值,應該不會有上下
03/05 17:12, 7F

03/05 17:16, , 8F
影像下方有一個小白點,raw檔看起來正常的
03/05 17:16, 8F

03/05 17:16, , 9F
應該沒有上下顛倒的問題
03/05 17:16, 9F

03/05 18:04, , 10F
或者 pixel format 不一樣?RGB BGR ARGB BGRA
03/05 18:04, 10F

03/05 19:06, , 11F
影像為RGB
03/05 19:06, 11F

03/05 19:07, , 12F
source_image_array.raw 這個檔案並沒有格式的問題
03/05 19:07, 12F

03/05 19:09, , 13F
在存這個檔案的時候,是將原始矩陣的值直接寫進去
03/05 19:09, 13F

03/05 19:11, , 14F
檔案的前兩個位原組,就是影像的第一個Pixel值
03/05 19:11, 14F

03/05 19:11, , 15F
你的 raw 跟我想像中的 raw 好像不一樣 XD
03/05 19:11, 15F

03/05 19:21, , 16F
對,我的RAW檔並不是PS在使用的那種
03/05 19:21, 16F

03/05 19:22, , 17F
他只是單純紀錄每一點的pixel值
03/05 19:22, 17F
※ 編輯: k82817 (223.137.176.70), 03/05/2017 19:43:20

03/05 19:25, , 18F
我用 GIMP 開,那兩個 raw 影像不一樣啊
03/05 19:25, 18F

03/05 19:26, , 19F
原始那張比較暗,值比較小
03/05 19:26, 19F

03/05 19:30, , 20F
你如果怕 OpenCV 幫你做多餘的事情就自己用 libpng 解
03/05 19:30, 20F

03/05 19:47, , 21F
B大 你可以告訴你用GIMP打開原始影像時
03/05 19:47, 21F

03/05 19:48, , 22F
前五個像素值是多少嗎?
03/05 19:48, 22F
※ 編輯: k82817 (223.137.176.70), 03/05/2017 19:48:59

03/05 19:57, , 23F
我在想存成PNG檔時,像素的值是不是就已經跑掉
03/05 19:57, 23F

03/05 19:58, , 24F
因為PNG檔的前五個像素就已經和source_image_array不同了
03/05 19:58, 24F

03/06 14:29, , 25F
OpenCV 預設值應該是BGR
03/06 14:29, 25F

03/06 15:27, , 26F
cvLoadImage第二個參數應該要下CV_LOAD_IMAGE_ANYDEPTH
03/06 15:27, 26F

03/06 15:27, , 27F
不然OpenCV會把讀進來的影像轉成8bits
03/06 15:27, 27F

03/06 15:35, , 28F
zero大 你是說要這要下嗎?
03/06 15:35, 28F

03/06 15:36, , 29F
cvLoadImage( filename,CV_LOAD_IMAGE_ANYDEPTH );??
03/06 15:36, 29F

03/06 15:37, , 30F
因為我去查百度,-1是讀取預設通道 0是轉成灰階
03/06 15:37, 30F

03/06 15:38, , 31F
1是讀取成彩色圖
03/06 15:38, 31F

03/06 15:47, , 32F
fall大 所以我去讀取s.Val[0],因為這張png檔並沒做rgb處理
03/06 15:47, 32F

03/06 15:47, , 33F
去讀取s.Val[1]和s.Val[2]都是0
03/06 15:47, 33F

03/06 15:51, , 34F
我想問題應該是出在source image array.raw轉成png的過程
03/06 15:51, 34F

03/06 15:53, , 35F
因為png的pixel已經和source image array.raw完全不相同了
03/06 15:53, 35F

03/06 15:53, , 36F
,可是那是別人的dll檔,無從研究
03/06 15:53, 36F

03/06 15:54, , 37F
我手上的文件是寫/* 8 bit, color or gray - deprecated
03/06 15:54, 37F

03/06 16:01, , 38F
↑參數下-1的話
03/06 16:01, 38F

03/06 16:02, , 39F
我用cvLoadImage( filename,CV_LOAD_IMAGE_ANYDEPTH );
03/06 16:02, 39F

03/06 16:07, , 40F
前幾個pixel是 0x1013 0x4013 0x6013 0xA012 跟你的raw
03/06 16:07, 40F

03/06 16:07, , 41F
也不太像就是..
03/06 16:07, 41F

03/06 17:37, , 42F
他的 png 是 16bits grayscale
03/06 17:37, 42F

03/06 19:29, , 43F
去看官方文件不要看百度
03/06 19:29, 43F

03/07 13:34, , 44F
有color profile嗎?
03/07 13:34, 44F

03/08 00:25, , 45F
tea大 是說raw的color profile?
03/08 00:25, 45F
文章代碼(AID): #1OkySdqo (C_and_CPP)