作者k82817 (ken)
看板C_and_CPP
標題[問題] OpenCV讀取png圖檔的每個pixel
時間Sun Mar 5 16:06:59 2017
開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1488701223.A.D32.html
※ 編輯: k82817 (223.137.176.70), 03/05/2017 16:11:15
1F:噓 Ommm5566: 作業自己做 03/05 16:09
※ 編輯: k82817 (223.137.176.70), 03/05/2017 16:12:40
2F:→ k82817: 已經讀取到png的像素值,也寫入進了66DK.raw當中 03/05 16:16
3F:→ k82817: 如果打開66DK.raw看起來和原始的png檔是一樣的 03/05 16:16
4F:→ k82817: 想知道為什麼影像看起來正常,但是像素卻不一樣了? 03/05 16:17
5F:推 Bencrie: 我先猜你 raw 的 y 軸上下顛倒 03/05 16:42
6F:→ k82817: B大 你是指程式產生的DK66.raw嗎? 03/05 17:11
7F:→ k82817: 可是我是透過cvGet1D去抓PNG檔第一點的值,應該不會有上下 03/05 17:12
8F:→ k82817: 影像下方有一個小白點,raw檔看起來正常的 03/05 17:16
9F:→ k82817: 應該沒有上下顛倒的問題 03/05 17:16
10F:推 Bencrie: 或者 pixel format 不一樣?RGB BGR ARGB BGRA 03/05 18:04
11F:→ k82817: 影像為RGB 03/05 19:06
12F:→ k82817: source_image_array.raw 這個檔案並沒有格式的問題 03/05 19:07
13F:→ k82817: 在存這個檔案的時候,是將原始矩陣的值直接寫進去 03/05 19:09
14F:→ k82817: 檔案的前兩個位原組,就是影像的第一個Pixel值 03/05 19:11
15F:推 Bencrie: 你的 raw 跟我想像中的 raw 好像不一樣 XD 03/05 19:11
16F:→ k82817: 對,我的RAW檔並不是PS在使用的那種 03/05 19:21
17F:→ k82817: 他只是單純紀錄每一點的pixel值 03/05 19:22
※ 編輯: k82817 (223.137.176.70), 03/05/2017 19:43:20
18F:推 Bencrie: 我用 GIMP 開,那兩個 raw 影像不一樣啊 03/05 19:25
19F:→ Bencrie: 原始那張比較暗,值比較小 03/05 19:26
20F:推 Bencrie: 你如果怕 OpenCV 幫你做多餘的事情就自己用 libpng 解 03/05 19:30
21F:→ k82817: B大 你可以告訴你用GIMP打開原始影像時 03/05 19:47
22F:→ k82817: 前五個像素值是多少嗎? 03/05 19:48
※ 編輯: k82817 (223.137.176.70), 03/05/2017 19:48:59
23F:→ k82817: 我在想存成PNG檔時,像素的值是不是就已經跑掉 03/05 19:57
24F:→ k82817: 因為PNG檔的前五個像素就已經和source_image_array不同了 03/05 19:58
25F:推 FallwinDs: OpenCV 預設值應該是BGR 03/06 14:29
26F:推 Zero0910: cvLoadImage第二個參數應該要下CV_LOAD_IMAGE_ANYDEPTH 03/06 15:27
27F:→ Zero0910: 不然OpenCV會把讀進來的影像轉成8bits 03/06 15:27
28F:→ k82817: zero大 你是說要這要下嗎? 03/06 15:35
29F:→ k82817: cvLoadImage( filename,CV_LOAD_IMAGE_ANYDEPTH );?? 03/06 15:36
30F:→ k82817: 因為我去查百度,-1是讀取預設通道 0是轉成灰階 03/06 15:37
31F:→ k82817: 1是讀取成彩色圖 03/06 15:38
32F:→ k82817: fall大 所以我去讀取s.Val[0],因為這張png檔並沒做rgb處理 03/06 15:47
33F:→ k82817: 去讀取s.Val[1]和s.Val[2]都是0 03/06 15:47
34F:→ k82817: 我想問題應該是出在source image array.raw轉成png的過程 03/06 15:51
35F:→ k82817: 因為png的pixel已經和source image array.raw完全不相同了 03/06 15:53
36F:→ k82817: ,可是那是別人的dll檔,無從研究 03/06 15:53
37F:推 Zero0910: 我手上的文件是寫/* 8 bit, color or gray - deprecated 03/06 15:54
38F:推 Zero0910: ↑參數下-1的話 03/06 16:01
39F:→ Zero0910: 我用cvLoadImage( filename,CV_LOAD_IMAGE_ANYDEPTH ); 03/06 16:02
40F:→ Zero0910: 前幾個pixel是 0x1013 0x4013 0x6013 0xA012 跟你的raw 03/06 16:07
41F:→ Zero0910: 也不太像就是.. 03/06 16:07
42F:推 Bencrie: 他的 png 是 16bits grayscale 03/06 17:37
43F:→ grayStone: 去看官方文件不要看百度 03/06 19:29
44F:推 TeaEEE: 有color profile嗎? 03/07 13:34
45F:→ k82817: tea大 是說raw的color profile? 03/08 00:25