Data compression (four)-color space conversion (non-sampling version) (2024)

experiment one:

  • Write RGB to YUV program, focus on function definition, initialization and calling of some lookup tables, buffer allocation. Convert the obtained RGB file to YUV file and watch it with YUV Viewer player to verify whether it is correct.

  • Write a program to convert YUV to RGB. Use this program to convert the given experimental data into RGB files. And with the original

    RGB files are compared, and if there are errors, analyze where the errors come from.

Article Directory

  • (1) Conversion formula and file storage format of YUV and RGB
  • (Two) the command line parameters of the main function
    • 2.1 Representation
    • 2.2 How to use
  • (3) Preliminary realization of color space conversion (no sampling) code
    • main.cpp
    • rgb2yuv.h
    • rgb2yuv.cpp
    • yuv2rgb.h
    • yuv2rgb.cpp
    • Experimental results
  • (4) Analysis of the causes of experimental errors and code modification
    • Error correction
    • Experimental results
  • (5) Optimize the code (using the lookup table method)
    • main.cpp
    • yuvrgb.h
    • yuvrgb.cpp
    • Experimental results

R=(298×Y+411×V57344)>>8G=(298×Y101×U211×V+34739)>>8B=(298×Y+519×U71117)>>8Y=(66×R+129×G+25×B)>>8+16U=(38×R74×G+112×B)>>8+128V=(112×R94×G18×B)>>8+128\begin{aligned} &R=(298\times Y+411\times V-57344)>>8\\ &G=(298\times Y-101\times U-211\times V+34739)>>8\\ &B=(298\times Y+519\times U-71117)>>8\\ &Y=(66\times R+129\times G+25\times B)>>8+16\\ &U=(-38\times R-74\times G+112\times B)>>8+128\\ &V=(112\times R-94\times G-18\times B)>>8+128 \end{aligned}R=(298×Y+411×V57344)>>8G=(298×Y101×U211×V+34739)>>8B=(298×Y+519×U71117)>>8Y=(66×R+129×G+25×B)>>8+16U=(38×R74×G+112×B)>>8+128V=(112×R94×G18×B)>>8+128

  The above formula is already quantified.

  Check out the information,RGBRGBRGBThe file storage format isBGRBGRBGRBGR BGR BGR\cdotsBGRBGRBGR,YUVYUVYUVThe file storage format is first save allYYY, Save allUUUAnd finally save allVVV

2.1 Representation

  One programmain()main()main()The function can contain two parameters:

  • The first parameter isintintintTypes of;
  • The second parameter is a string array;

  Usually, the first parameter is namedargcargcargc, The second parameter isargvargvargv. Since the declaration of the string array in the function header can have two forms, somain()main()main()There are also two ways to write functions.

  1. main()main()main()functionWriting one

    int main(int argc, char** argv){ return 0;}
  2. main()main()main()functionWriting two:

    int main(int argc, char* argv[]){ return 0;}

2.2 How to use

  • The meaning of the parameters:

      int argc​: Represents the number of strings.argc = 1 + the number of strings entered by the user, The value of argc is calculated automatically by the operating system, and the programmer does not need to assign it.

      char argv[]*: It stores multiple strings, the form of the string is as follows:

    argv[0] = the name of the executable file. For example, change.exe. (This string does not require user input, and is the same as argc, which can be automatically generated by the operating system.

    argv[1] = string 1

    argv[2] = string 2

    argv[3] = string 3

    \vdots

  • How to input parameters in programming mode?

  The platform used isVisualStudio2019Visual Studio 2019VisualStudio2019, The file to be used isdown.rgbdown.rgbdown.rgb, The file to be generated isup.yuv,cho.rgbup.yuv,cho.rgbup.yuv,cho.rgb,The steps of parameter input are shown in the following figure:

1. Open the properties window of the upper taskbar debugging interfaceData compression (four)-color space conversion (non-sampling version) (1)
2. Select debug in configuration propertiesData compression (four)-color space conversion (non-sampling version) (2)
3. Modify the command parameters as requiredData compression (four)-color space conversion (non-sampling version) (3)

  Based on the above knowledge, the preliminary realization of color space conversion can be easily carried out. Header filergb2yuv.h,yuv2rgb.hrgb2yuv.h,yuv2rgb.hrgb2yuv.h,yuv2rgb.hAnd source filesmain.cpp,rgb2yuv.cpp,yuv2rgb.cppmain.cpp,rgb2yuv.cpp,yuv2rgb.cppmain.cpp,rgb2yuv.cpp,yuv2rgb.cppcomposition.

  Solution Explorer is shown in the figure below:

Data compression (four)-color space conversion (non-sampling version) (4)

  Experiment codeas follows:

main.cpp

#include <iostream>#include <cstdio>#include <fstream>#include "rgb2yuv.h"#include "yuv2rgb.h"using namespace std;#define size 196608#define usize 65536#define vsize 131072using namespace std;int main(int argc, char** argv){ifstream infile(argv[1],ios::binary);ofstream outYUV(argv[2], ios::binary);ofstream outRGB(argv[3], ios::binary);if (!infile) { cout << "error to open file1!" << endl; }if (!outYUV) { cout << "error to open file2" << endl; }if (!outRGB) { cout << "error to open file3" << endl; }unsigned char* in = new unsigned char[size];unsigned char* YUV = new unsigned char[size];unsigned char* RGB = new unsigned char[size];infile.read((char*)in, size);rgb2yuv(in,YUV,size, usize, vsize);//First conversionyuv2rgb(YUV, RGB, usize, vsize);//The second conversion/*for (int i = 0; i < size; i++){if (abs(in[i] - RGB[i]) > 5)cout << "i=" << i << " in[" << i << "]=" << int(in[i]) << " RGB[" << i << "]=" << int(RGB[i]) << endl;}*/outYUV.write((char*)YUV, size);outRGB.write((char*)RGB, size);delete in;delete YUV;delete RGB;infile.close();outYUV.close();outRGB.close();return 0;}

rgb2yuv.h

#pragma oncevoid rgb2yuv(unsigned char* rgb, unsigned char* yuv, int size,int usize,int vsize);

rgb2yuv.cpp

void rgb2yuv(unsigned char* rgb, unsigned char* yuv,int size,int usize,int vsize){unsigned char r, g, b, y, u, v;int j = 0;for (int i = 0;i < size;){b = *(rgb + i);g = *(rgb + i + 1);r = *(rgb + i + 2);y = ((66 * r + 129 * g + 25 * b) >> 8) + 16;u = ((-38 * r - 74 * g + 112 * b) >> 8) + 128;v = ((112 * r - 94 * g - 18 * b) >> 8) + 128;*(yuv + j) = y;*(yuv + j + usize) = u;*(yuv + j + vsize) = v;i = i + 3;//Each rgb is 1 groupj++;}}

yuv2rgb.h

#pragma oncevoid yuv2rgb(unsigned char* yuv, unsigned char* rgb,int usize,int vsize);

yuv2rgb.cpp

#pragma once#include "yuv2rgb.h"#include <iostream>using namespace std;void yuv2rgb(unsigned char* yuv, unsigned char* rgb,int usize,int vsize){unsigned char r, g, b, y, u, v;int j = 0;for (int i = 0; i < usize; i++){y = *(yuv + i);u = *(yuv + i + usize);v = *(yuv + i + vsize);r = (298 * y + 411 * v - 57344) >> 8;g = (298 * y - 101 * u - 211 * v + 34739) >> 8;b = (298 * y + 519 * u - 71117) >> 8;*(rgb + j) = b;*(rgb + j + 1) = g;*(rgb + j + 2) = r;j = j + 3;}}

Experimental results

down.rgbup.yuvcho.rgb
Data compression (four)-color space conversion (non-sampling version) (5)Data compression (four)-color space conversion (non-sampling version) (6)Data compression (four)-color space conversion (non-sampling version) (7)

among them,down.rgbdown.rgbdown.rgbwithcho.rgbcho.rgbcho.rgbuseYUVviewerPlusYUVviewerPlusYUVviewerPlusThe way to open is:

Data compression (four)-color space conversion (non-sampling version) (8)

  The opened image is an inverted image (due tobmpbmpbmpThe image format is stored backwards, so.rgb.rgb.rgbImage usebmpbmpbmpIt will fall when the mode is opened). The pictures in the above table have been rotated using WeChat for easy identification, butYUVYUVYUVFiles andRGBRGBRGBThere is still mirror flipping between files, but it does not affect viewing and comparison.

  up.yuvup.yuvup.yuvuseYUVviewerPlusYUVviewerPlusYUVviewerPlusThe way to open is:

Data compression (four)-color space conversion (non-sampling version) (9)

  It can be seen from the comparison chart of the three images,RGBtoYUVRGB to YUVRGBtoYUV'S experiment was successfully completed, andYUVtoRGBYUVtoRGBYUVtoRGBThere is a problem with the experiment, which is transferred outcho.rgbcho.rgbcho.rgbThere are more red noise in the image.

Error correction

  Inferred available, in progressYUVtoRGBYUVtoRGBYUVtoRGBWhen you getRGBRGBRGBThree figures may exceedunsignedcharunsigned\ charunsignedcharThe range that the type can represent, that is, possible<0<0<0or>255>255>255

   So it’s necessary toyuv2rgb.cppyuv2rgb.cppyuv2rgb.cppThe file is appropriately revised,>255>255>255Values ​​are direct=255=255=255,<0<0<0Values ​​are direct=0=0=0

  After modificationyuv2rgb.cppyuv2rgb.cppyuv2rgb.cppIs as follows:

#pragma once#include "yuv2rgb.h"#include <iostream>using namespace std;void yuv2rgb(unsigned char* yuv, unsigned char* rgb,int usize,int vsize){int r, g, b, y, u, v;int j = 0;for (int i = 0; i < usize; i++){y = int(*(yuv + i));u = int(*(yuv + i + usize));v = int(*(yuv + i + vsize));r = (298 * y + 411 * v - 57344) >> 8;if (r > 255) { r = 255; }if (r < 0) { r = 0; }g = (298 * y - 101 * u - 211 * v + 34739) >> 8;if (g > 255) { g = 255; }if (g < 0) { g = 0; }b = (298 * y + 519 * u - 71117) >> 8;if (b > 255) { b = 255; }if (b < 0) { b = 0; }*(rgb + j) = unsigned char(b);*(rgb + j + 1) = unsigned char(g);*(rgb + j + 2) = unsigned char(r);j = j + 3;}}

Experimental results

down.rgbup.yuvcho.rgb
Data compression (four)-color space conversion (non-sampling version) (10)Data compression (four)-color space conversion (non-sampling version) (11)Data compression (four)-color space conversion (non-sampling version) (12)

  So far, almost doneRGBtoYUVRGB to YUVRGBtoYUVwithYUVtoRGBYUVtoRGBYUVtoRGBTwo experiments.

  Using a lookup table to optimize the code. Header fileyuvrgb.hyuvrgb.hyuvrgb.hAnd source filesmain.cpp,yuvrgb.cppmain.cpp,yuvrgb.cppmain.cpp,yuvrgb.cppcomposition.

  Solution Explorer is shown in the figure below:

Data compression (four)-color space conversion (non-sampling version) (13)

main.cpp

#include <iostream>#include <cstdio>#include <fstream>#include "yuvrgb.h"using namespace std;#define size 196608#define usize 65536#define vsize 131072#define height 256#define weight 256//Lookup table initializationint* RGBYUV298 = new int[256];int* RGBYUV411 = new int[256];int* RGBYUV101 = new int[256];int* RGBYUV211 = new int[256];int* RGBYUV519 = new int[256];int* RGBYUV66 = new int[256];int* RGBYUV129 = new int[256];int* RGBYUV25 = new int[256];int* RGBYUV38 = new int[256];int* RGBYUV74 = new int[256];int* RGBYUV112 = new int[256];int* RGBYUV94 = new int[256];int* RGBYUV18 = new int[256];int main(int argc, char** argv){initLookupTable();ifstream infile(argv[1],ios::binary);ofstream outYUV(argv[2], ios::binary);ofstream outRGB(argv[3], ios::binary);if (!infile) { cout << "error to open file1!" << endl; }if (!outYUV) { cout << "error to open file2" << endl; }if (!outRGB) { cout << "error to open file3" << endl; }unsigned char* infi = new unsigned char[size];unsigned char* YUVfi = new unsigned char[size];unsigned char* RGBfi = new unsigned char[size];infile.read((char*)infi, size);rgb2yuv(infi, YUVfi, size, usize, vsize);yuv2rgb(YUVfi, RGBfi, usize, vsize);outYUV.write((char*)YUVfi, size);outRGB.write((char*)RGBfi, size);fileend(infi,YUVfi,RGBfi);infile.close();outYUV.close();outRGB.close();return 0;}

yuvrgb.h

#pragma oncevoid yuv2rgb(unsigned char* yuv, unsigned char* rgb,int usize,int vsize);void rgb2yuv(unsigned char* rgb, unsigned char* yuv, int size, int usize, int vsize);void initLookupTable();void fileend(unsigned char* infi, unsigned char* YUVfi, unsigned char* RGBfi);

yuvrgb.cpp

#pragma once#include "yuvrgb.h"#include <iostream>using namespace std;extern int* RGBYUV298;extern int* RGBYUV411;extern int* RGBYUV101;extern int* RGBYUV211;extern int* RGBYUV519;extern int* RGBYUV66 ;extern int* RGBYUV129;extern int* RGBYUV25 ;extern int* RGBYUV38 ;extern int* RGBYUV74 ;extern int* RGBYUV112;extern int* RGBYUV94 ;extern int* RGBYUV18 ;void initLookupTable(){for (int i = 0; i < 256; i++){RGBYUV298[i] = 298 * i;RGBYUV411[i] = 411 * i;RGBYUV101[i] = 101 * i;RGBYUV211[i] = 211 * i;RGBYUV519[i] = 519 * i;RGBYUV66[i] = 66 * i;RGBYUV129[i] = 129 * i;RGBYUV25[i] = 25 * i;RGBYUV38[i] = 38 * i;RGBYUV74[i] = 74 * i;RGBYUV112[i] = 112 * i;RGBYUV94[i] = 94 * i;RGBYUV18[i] = 18 * i;}}void yuv2rgb(unsigned char* yuv, unsigned char* rgb,int usize,int vsize){int r, g, b, y, u, v;int j = 0;for (int i = 0; i < usize; i++){y = int(*(yuv + i));u = int(*(yuv + i + usize));v = int(*(yuv + i + vsize));/*r = (298 * y + 411 * v - 57344) >> 8;*/r = (RGBYUV298[y]+ RGBYUV411[v]-57344)>>8;if (r > 255) { r = 255; }if (r < 0) { r = 0; }/*g = (298 * y - 101 * u - 211 * v + 34739) >> 8;*/g = (RGBYUV298[y] - RGBYUV101[u] - RGBYUV211[v] + 34739) >> 8;if (g > 255) { g = 255; }if (g < 0) { g = 0; }/*b = (298 * y + 519 * u - 71117) >> 8;*/b = (RGBYUV298[y] + RGBYUV519[u] - 71117) >> 8;if (b > 255) { b = 255; }if (b < 0) { b = 0; }*(rgb + j) = unsigned char(b);*(rgb + j + 1) = unsigned char(g);*(rgb + j + 2) = unsigned char(r);j = j + 3;}}void rgb2yuv(unsigned char* rgb, unsigned char* yuv, int size, int usize, int vsize){int r, g, b, y, u, v;int j = 0;for (int i = 0; i < size;){b = int(*(rgb + i));g = int(*(rgb + i + 1));r = int(*(rgb + i + 2));/*y = ((66 * r + 129 * g + 25 * b) >> 8) + 16;*/y = ((RGBYUV66[r] + RGBYUV129[g] + RGBYUV25[b]) >> 8) + 16;/*u = ((-38 * r - 74 * g + 112 * b) >> 8) + 128;*/u = ((-RGBYUV38[r] - RGBYUV74[g] + RGBYUV112[b]) >> 8) + 128;/*v = ((112 * r - 94 * g - 18 * b) >> 8) + 128;*/v = ((RGBYUV112[r] - RGBYUV94[g] - RGBYUV18[b]) >> 8) + 128;/*if ((y > 255) || (u > 255) || (v > 255) || (y < 0) || (u < 0) || (v < 0)){cout << "y=" << y << "u=" << u << "v=" << v << endl;}*/*(yuv + j) = unsigned char(y);*(yuv + j + usize) = unsigned char(u);*(yuv + j + vsize) = unsigned char(v);i = i + 3;//Each rgb is 1 groupj++;}}void fileend(unsigned char* infi, unsigned char* YUVfi, unsigned char* RGBfi){delete infi;delete YUVfi;delete RGBfi;deleteRGBYUV298;deleteRGBYUV411;deleteRGBYUV101;deleteRGBYUV211;deleteRGBYUV519;deleteRGBYUV66;deleteRGBYUV129;deleteRGBYUV25;deleteRGBYUV38;deleteRGBYUV74;deleteRGBYUV112;deleteRGBYUV94;deleteRGBYUV18;}

Experimental results

down.rgbup.yuvcho.rgb
Data compression (four)-color space conversion (non-sampling version) (14)Data compression (four)-color space conversion (non-sampling version) (15)Data compression (four)-color space conversion (non-sampling version) (16)

  So far, 4:4:4 is completedRGBRGBRGBFile with 4:4:4YUVYUVYUVConversion between files.

Data compression (four)-color space conversion (non-sampling version) (2024)

FAQs

What is 4 4 4 color space? ›

Full color depth is usually referred to as 4:4:4. The first number indicates that there are four pixels across, the second indicates that there are four unique colors, and the third indicates that there are four changes in color for the second row.

What is YCbCr color format? ›

YCbCr and Y′CbCr are a practical approximation to color processing and perceptual uniformity, where the primary colors corresponding roughly to red, green and blue are processed into perceptually meaningful information.

What is the difference between sRGB color space and linear sRGB color space? ›

They differ only in the transfer functions — Linear-sRGB is linear with respect to physical light intensity. sRGB uses the nonlinear sRGB transfer functions, and more closely resembles the way that the human eye perceives light and the responsiveness of common display devices. That difference is important.

What's the difference between RGB and YUV? ›

As we know, RGB stands for red, blue and green and YUV stands for (Y) luma, or brightness, (U) blue projection and (V) red projection. HSL stands for (H) hue, (S) saturation, and L (lightness) and CMYK stands for (C ) cyan, (M) magenta, (Y) yellow and (K) black. Still with us?

What is the 4 colors rule? ›

The four-color theorem states that any map in a plane can be colored using four-colors in such a way that regions sharing a common boundary (other than a single point) do not share the same color.

What is the 4 color process? ›

Printing Lingo: What is 4-Color Process Printing? 4-Color Process uses Cyan, Magenta, Yellow, and Black inks. When applied in successive layers, these four ink colors create a full color image.

Which color format is best? ›

The color format that's best for your needs is dependent on a single question: what do you plan to do with your design? If your design will end up on digital screens like computer monitors or TVs, you should use RGB. If you need to physically print anything like product labels, brochures, or more, you should use CMYK.

Is HDMI RGB or YCbCr? ›

Modern video displays with HDMI digital inputs process video signals in YCbCr format.

Is RGB high better than YCbCr? ›

Yes, [RGB High] is more accurate than [YCbCr] for SDR on the Apple TV 4K box, but we're not doing a blanket recommendation due to potential black level mismatch & RGB-YUV conversion errors with different TVs. For HDR10 & Dolby Vision content, the setting makes no difference.

What is the best color space mode? ›

DCI P3 is the color space most commonly used by the film industry. Apple, Samsung, and Google also use this color space for their model devices. This is a good color space to use if you are making digital films or developing graphical interfaces for mobile devices.

Which sRGB color profile is best? ›

Summary Overall users can expect to get better and more consistent results using the sRGB v4 profile versus the sRGB v2 profiles.

Which color space is better Adobe or sRGB? ›

sRGB and Adobe RGB are ways to represent colors. sRGB is sufficient for most uses and has a smaller range of colors, mainly noticeable in blues and greens. Adobe RGB has a wider range of these colors, making it better for high-quality prints and RAW photography, where you can choose the color space later.

What's the advantage of using Yuv color space? ›

YUV color-spaces are a more efficient coding and reduce the bandwidth more than RGB capture can. Most video cards, therefore, render directly using YUV or luminance/chrominance images. The most important component for YUV capture is always the luminance, or Y component.

What is 4 4 4 color mode? ›

4:4:4 may refer to: Digital images or video in which all color components have the same sampling rate, thus not using chroma subsampling. Another name for the RGB color space.

What does 4 4 4 mean? ›

The highest-quality digital video encoding mode, which compresses all the color information in the original signal.

What does full color 4 4 4 mean? ›

What is 4:4:4 Color? 4:4:4 Color is a subsampling technique that compresses the information in a digital video signal. We know that every pixel in an image or video has its color information. So, using this technique, you can extract all the color information without any loss.

What is the best color space setting for TV? ›

Rec. 709 is the standard camera color space for HDTV with a gamut identical to sRGB. Rec. 709 is often referred to as the standard video color space when working with video recording.

What is 4 4 4 format? ›

4:4:4 may refer to: Digital images or video in which all color components have the same sampling rate, thus not using chroma subsampling. Another name for the RGB color space.

What is the difference between raw and 444? ›

444XQ is the closest to uncompressed data and RAW is visually identical to 444XQ but with 60% of the file size. The problem with Prores RAW is that it's not supported on Resolve and You are forced to transcode to another format for usage in that software.

Top Articles
How to Type Umlauts: ä ö ü ß [on PC, Mac, iPhone & Android] - Emma Loves German
Des tatouages ​​qui montrent l’amour : 10 idées de tatouage touchantes
Mansfield Shower Surround
Baue Recent Obituaries
Buff Streams .Io
Barber Gym Quantico Hours
New Zero Turn Mowers For Sale Near Me
Adventhealth Employee Hub Login
St Vrain Chain Gang
Omniplex Cinema Dublin - Rathmines | Cinema Listings
Hidden Goblin Stash Failed Perception
Log in or sign up to view
Myvetstoreonline.pharmacy
Convert Ng Dl To Pg Ml
FREE Houses! All You Have to Do Is Move Them. - CIRCA Old Houses
Nsu Kpcom Student Handbook
Badddae
R Umineko
Black Adam Showtimes Near Kerasotes Showplace 14
C.J. Stroud und Bryce Young: Zwei völlig unterschiedliche Geschichten
Premier Auto Works-- The House Of Cash Car Deals
Flappy Bird Cool Math Games
Sitel Group®, leader mondial de l’expérience client, accélère sa transformation et devient Foundever®
Oppenheimer Showtimes Near Regal Jack London
Does Publix Have Sephora Gift Cards
Gargoyle Name Generator
Fd Photo Studio New York
Weird Al.setlist
Rachel Zoe first outing hours after announcing shock marriage split
Gsa Elibary
Bluestacks How To Change Master Instance
Burlington Spectrum Tucson
Conner Westbury Funeral Home Griffin Ga Obituaries
Www.cvs/Otchs/Simply
3Kh0 1V1 Lol
Chrissy Laboy Daughter
How Much Does Hasa Pay For Rent 2022
Myrtle Beach Armslist
Indiana Immediate Care.webpay.md
Concord Mills Mall Store Directory
O'reillys Parts Store
Healthstream Mobile Infirmary
Jasper William Oliver Cable Alexander
Craigslist Garage Sales Schenectady Ny
Motorcycle Sale By Owner
University of Nevada, Las Vegas
Ttw Cut Content
Exceptions to the 5-year term for naturalisation in the Netherlands
Tetris Google Sites
Sammyflood
Platform Overview - Aria Systems
Latest Posts
Article information

Author: Sen. Emmett Berge

Last Updated:

Views: 5715

Rating: 5 / 5 (60 voted)

Reviews: 83% of readers found this page helpful

Author information

Name: Sen. Emmett Berge

Birthday: 1993-06-17

Address: 787 Elvis Divide, Port Brice, OH 24507-6802

Phone: +9779049645255

Job: Senior Healthcare Specialist

Hobby: Cycling, Model building, Kitesurfing, Origami, Lapidary, Dance, Basketball

Introduction: My name is Sen. Emmett Berge, I am a funny, vast, charming, courageous, enthusiastic, jolly, famous person who loves writing and wants to share my knowledge and understanding with you.