Diskuze: Jak zjisti počet černých pixelů a nejtmavší pixel?
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj,
a co GDI+? To můžeš použít?
nejsem si jisty:-) když budeme vycházet z toho, že mám
struct pixel {
unsigned char blue;
unsigned char green;
unsigned char red;
};
A pole máš předem definované nebo si načteš obrázek za chodu programu?
Zkus tohle https://docs.microsoft.com/…map-getpixel , je to přes GDI+, určitě tam bude i možnost zjištění rozměrů obrázku.
Nehledej v tom nic složitého. Obrazová data jsou reprezentována jako 2D pole pixel struktur. Vytvoříš funkci která přebírá 2D pole jako argument funkce, přes argument budeš vracet strukturu reprezentující nejtmavší pixel (tmavost dle tvého kritéria), návratový typ bude celé číslo reprezentující počet černých pixelů (RGB 0,0,0). Vytvoříš celočíselnou proměnnou pro počet černých pixelů, inicializuješ ji na 0. Uložíš si první barevnou složku prvního pixelu. Postupně budeš procházet celé pole pomocí jednoho for cyklu a porovnávat na černý pixel a aktualizovat jejich počet. Stejně tak budeš porovnávat tmavost pixelů a aktualizovat nejtmavší pixel. Nakonec vrátíš hodnoty způsobem uvedeným viz. výše. To je celé.
Nemohl by jsi sem dat priklad? Ale jak urcim nejtmavsi pixel? Budu scitat rgb slozky a hledat minimum z hodnot vetsich jak 0?
Prosim o kod:-)
Zapis RGB nebo RGBA (a tusim ze uplne nej pouziva dokonce 5 barevnych slozek) pouziva windows bitmap, napriklad.
Skolni priklady res pomoci googlu nebo pridej vlastni kod. Takove studium nebo prace, zkopiruji hotove reseni z fora, to vetsina lidi tady moc nepodporuje. 500 kc za kazdou zapocatou hodinu je takova min. sazba.
Nejdriv si teda musis urcit logiku, kterou hledas. Nejtmavvi pixel je ten, ktery pro rezim sedi ma nejmensi hodnotu. Takze hledas nejmensi cislo z pole. To je typicky skolni priklad pro stredni skolu.
Co je vsak dulezitejsi, je uvedomit si, ze rgb (barvy) neni gray-scale
(odstiny sedi). Tudiz barevny model bude treba prevest na jiny, ktery ma v sobe
slozku, ktera se vyuziva jako odstiny sedi (chroma). To je naprikla HSV, HSL...,
jasove slozky YgCrCm nebo jine
google = rgb to hsv
https://en.wikipedia.org/…/HSL_and_HSV
Y 601 ′ = 0.2989 ⋅ R + 0.5870 ⋅ G + 0.1140 ⋅ B (SDTV)
Y 240 ′ = 0.212 ⋅ R + 0.701 ⋅ G + 0.087 ⋅ B (Adobe)
Y 709 ′ = 0.2126 ⋅ R + 0.7152 ⋅ G + 0.0722 ⋅ B (HDTV)
Y 2020 ′ = 0.2627 ⋅ R + 0.6780 ⋅ G + 0.0593 ⋅ B (UHDTV, HDR)
Jestli to spravne chapu, tak ten posledni vzorec je nejnovejsi tv standard
pro vypocet jasove slozky (odstiny sedi), Y 2020. Ten prvni je zase ten, ktery
najdes ve vetsine literatury, Y 601.
Otazkou je, zda vas ucitel myslel skutecne barvy nebo mu jde jen o nalezeni
nejmensiho cisla.
V podstate by slo udelat i prumer vsech 3 barev a najit to nejmensi cislo. Ale to neni obrazkove spravny postup.
Zde máš kus příkladu na kterém můžeš stavět
// Color data generator
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// #define DEBUG
#define M 64 // rows
#define N 64 // cols
#define MIN 0 // minimal color value
#define MAX 255 // maximal color value
struct pixel {
unsigned char blue;
unsigned char green;
unsigned char red;
};
int main(void) {
struct pixel color_data[M][N];
struct pixel darkness;
unsigned int nBlack;
srand((unsigned)time(NULL));
// Generating RGB color data
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
color_data[i][j].red = (rand() % (MAX - MIN + 1)) + MIN;
color_data[i][j].green = (rand() % (MAX - MIN + 1)) + MIN;
color_data[i][j].blue = (rand() % (MAX - MIN + 1)) + MIN;
}
}
#ifdef DEBUG
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
printf("RGB(%d,%d,%d)\n", color_data[i][j].red, color_data[i][j].green, color_data[i][j].blue);
}
}
#endif
// darkness, nBlack???
// ...
return 0;
}
Jak už jsem psal v příspěvku výše, tmavost má různá kritéria. Pro tvé potřeby bohatě postačí, že nejtmavší barva bude ta, kde součet barevných složek bude nejnižší. Černá barva má složky RGB(0,0,0).
Tvým úkolem je naplnit proměnné darkness reprezentující nejtmavší pixel a nBlack reprezentující počet černých pixelů.
Zobrazeno 10 zpráv z 10.