рдЫрд╡рд┐ рд╡рд┐рдкрд░реАрдд рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ RGB рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛



рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЫрд╡рд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ред

рдЪреВрдВрдХрд┐ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬрд┐рд╕рдореЗрдВ рдкреВрд░реНрдг HD рд╡реАрдбрд┐рдпреЛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рд╢рд╛рдорд┐рд▓ рдереАред OpenMP рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред



рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ [1]ред

рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП RGB рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЫрд╡рд┐ lAB рдХреА рдФрд╕рдд рдЪрдордХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд▓реВрдк рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП OpenMP рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
#pragma omp parallel for private(valueB,valueG,valueR) reduction(+:lAB) schedule(static,1) for (int j = 0; j < ptrImage->imageSize; j = j+3) { valueB = ptrImage->imageData[j]; valueG = ptrImage->imageData[j+1]; valueR = ptrImage->imageData[j+2]; lAB += (int)(valueR * 0.299 + valueG * 0.587 + valueB * 0.114); } //  lAB /= imageRows * imageCols; 

рдлрд┐рд░, рдкреНрд░рддреНрдпреЗрдХ рд░рдВрдЧ рдШрдЯрдХреЛрдВ R, G, рдФрд░ B рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдФрд╕рдд рдЪрдордХ рдорд╛рди рдбреЗрд▓реНрдЯрд╛ рд╕реЗ рд╡рд┐рдЪрд▓рди рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд╢реНрдореАрд░ рдХреЗ рд▓рд╛рдн (рдХреНрд╖реАрдгрди) рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рд╡рд┐рдЪрд▓рди рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХрд┐рд╕реА рдЫрд╡рд┐ рдореЗрдВ рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рд╕реАрдзреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рднреА рд░рдВрдЧ рдШрдЯрдХреЛрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо 256 рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд░рдВрдЧ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдкреИрд▓реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛ред рд╕рд░рдгреА рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд░рдВрдЧ рдШрдЯрдХ рдХреЗ рдкреБрд░рд╛рдиреЗ рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд░рдгреА рдХрд╛ рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡рд╛рд▓реЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреИрд▓реЗрдЯ рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
 //  double k = 1.0 + correction / 100.0; for (int i = 0; i < 256; i++) { int delta = (int)i - lAB; int temp = (int)(lAB + k *delta); if (temp < 0) temp = 0; if (temp >= 255) temp = 255; b[i] = (unsigned char)temp; } 


рдФрд░ рдлрд┐рд░, рд╣рдо рдкреВрд░реА рдЫрд╡рд┐ рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдирдП рдорд╛рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдореА рдкреИрд▓реЗрдЯ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдирдП рдХреЗ рд╕рд╛рде рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд░рдВрдЧ рдШрдЯрдХ рдХреЗ рдкреБрд░рд╛рдиреЗ рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ:
 #pragma omp parallel for firstprivate(b) for (int j = 0; j < ptrImage->imageSize; j++) { unsigned char value = ptrImage->imageData[j]; ptrImage->imageData[j] = (unsigned char)b[value]; } 

рд╡рд┐рдкрд░реАрдд рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдВрдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб:
 const int L = 256; void AddContrastFilter(IplImage* ptrImage, int _correction) { //     4,      omp_set_num_threads(4); int correction = _correction; // int b[L]; //    int imageRows = ptrImage->height; int imageCols = ptrImage->width; int lAB = 0; unsigned char valueB = 0; unsigned char valueG= 0; unsigned char valueR= 0; //    #pragma omp parallel for private(valueB,valueG,valueR) reduction(+:lAB) schedule(static,1) for (int j = 0; j < ptrImage->imageSize; j = j+3) { valueB = ptrImage->imageData[j]; valueG = ptrImage->imageData[j+1]; valueR = ptrImage->imageData[j+2]; lAB += (int)(valueR * 0.299 + valueG * 0.587 + valueB * 0.114); } //    lAB /= imageRows * imageCols; //  double k = 1.0 + correction / 100.0; //RGB    for (int i = 0; i < L; i++) { int delta = (int)i - lAB; int temp = (int)(lAB + k *delta); if (temp < 0) temp = 0; if (temp >= 255) temp = 255; b[i] = (unsigned char)temp; } #pragma omp parallel for firstprivate(b) for (int j = 0; j < ptrImage->imageSize; j++) { unsigned char value = ptrImage->imageData[j]; ptrImage->imageData[j] = (unsigned char)b[value]; } return 0; } 

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ рдХрд┐ рдЪрд╛рд░-рдХреЛрд░ рдЗрдВрдЯреЗрд▓ Xeon рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдПрдХ рдкреВрд░реНрдг HD рдлреНрд░реЗрдо рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд▓рдЧрднрдЧ 8 рдПрдордПрд╕ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред

рд╕рдВрджрд░реНрдн


1. рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдореЗрдВ рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг: http://www.kweii.com/site/color_theory/Contrast100_en.pdf

Source: https://habr.com/ru/post/In139428/


All Articles