Using existing tools, how can I extract into separate images the Luma, Cb, Cr channels of a JPEG image?
I am seeking a method to extract into separate images the Luma (Y), Cb (blue component), Cr (red component), channels of the JPEG images:
- Seattle Police Department image #1
- Seattle Police Department image #2
- Seattle Police Department image #3
I wo开发者_如何学JAVAuld like results equivalent to this example from Wikipedia.
The output must be calculated directly from the JPEG Start-of-Scan (SOS) data and other data in the JPEG, rather than 'back calculated' from the RGB images output by a decompressor. The purpose of this task is to produce images which represent the 'raw data' as closely as possible.
Are there existing tools which can accomplish this? I am considering throwing together something using Python, PyImage, etc. but I am surprised my search for open source or free tools has come up empty. I am aware there are many libraries which could help, although I am open to becoming aware of more libraries.
For this question, the correct answer would be a tool chain of free and/or open-source tools which can do the job. Tools with source are preferred. These tools can run on any platform, but Linux or Win32 would be immediately useful.
Answer inspired by codelogic
Given the libjpeg implementation, change djpeg.c and wrppm.c.
wrppm.c:
189: case JCS_RGB: 190: + case JCS_YCbCr: 191: /* emit header for raw PPM format */
djpeg.c
560: case FMT_PPM: 561: + cinfo.quantize_colors = 0; 562: + cinfo.out_color_space = JCS_YCbCr;
Obviously, this is quick hack, because I have a private copy where PPM output is always forced to YCbCr, but it works and I thank you, codelogic, for your Stone Code Logic.
As suggested your best bet would be to use libjpeg directly. Specifically, you might be able to set jpeg_decompress_struct
's out_color_space
member to be JCS_YCbCr
instead of JCS_RGB
and read the scanlines as usual. Here's some sample code (GPL).
Well the obvious one is libjpg.
精彩评论