IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.

Aktivity
Avatar
Otakar
Člen
Avatar
Otakar:9.5.2021 21:09

Ahoj, potřeboval bych v c udělat jednoduchý progrma v příkazovém řádku - který s pole (atributry RGB) zjisti počet černých pixelů a vypíše nejtmavší pixel - tj čísla rgb...

Zkusil jsem: netuším jak na to...

Chci docílit: nemůžu použít žadnou knihovnu jako opencv...

 
Odpovědět
9.5.2021 21:09
Avatar
Ondřej Šrytr:9.5.2021 21:20

Ahoj,

a co GDI+? To můžeš použít?

 
Nahoru Odpovědět
9.5.2021 21:20
Avatar
Otakar
Člen
Avatar
Odpovídá na Ondřej Šrytr
Otakar:9.5.2021 21:37

nejsem si jisty:-) když budeme vycházet z toho, že mám

struct pixel {
    unsigned char blue;
    unsigned char green;
    unsigned char red;
};
 
Nahoru Odpovědět
9.5.2021 21:37
Avatar
Odpovídá na Otakar
Ondřej Šrytr:9.5.2021 21:40

A pole máš předem definované nebo si načteš obrázek za chodu programu?

 
Nahoru Odpovědět
9.5.2021 21:40
Avatar
Otakar
Člen
Avatar
Odpovídá na Ondřej Šrytr
Otakar:9.5.2021 21:44

šli by obě varianty? děkuji

 
Nahoru Odpovědět
9.5.2021 21:44
Avatar
Ondřej Šrytr:9.5.2021 21:50

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.

 
Nahoru Odpovědět
9.5.2021 21:50
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Otakar
DarkCoder:9.5.2021 22:50

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é.

Nahoru Odpovědět
9.5.2021 22:50
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Otakar
Člen
Avatar
Odpovídá na DarkCoder
Otakar:10.5.2021 4:24

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:-)

Editováno 10.5.2021 4:27
 
Nahoru Odpovědět
10.5.2021 4:24
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:10.5.2021 10:52

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.

Editováno 10.5.2021 10:52
 
Nahoru Odpovědět
10.5.2021 10:52
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Otakar
DarkCoder:10.5.2021 11:13

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ů.

Nahoru Odpovědět
10.5.2021 11:13
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.