作者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/cn.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