Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Отделяне на основните канали на цветно изображение

Featured Replies

Здравейте. Имам малък опит в програмирането на С++ и се сблъсках с една трудност. Уча в Пловдивския университет и се появиха някакви преподаватели, които твърдят, че няма как да не сме учили С++ и трябва да можем да я направим тази задача. Моля а помощ, защото нямам представа какво трябва да се случи. Задачата е:
Отделете основните канали на едно цветно изображение, представено в LCD мониторите, като за целта напишете програма за представяне на отделните цветове - R G B. Програмата да се напише в средата на С/С++ или MatLab.

преди 35 минути, AlonsoBest написа:

Отделете основните канали на едно цветно изображение, представено в LCD мониторите, като за целта напишете програма за представяне на отделните цветове - R G B. Програмата да се напише в средата на С/С++ или MatLab.

Малко ми е странно какво значи "представено в LCD мониторите", или (освен ако не говорим за фърмуеър) какво общо има вида на монитора със изображението ама айде.

Но поне формата, в който са представени данните известен ли ти е? Повечето текущо ползвани монитори показват 8 битови RGB изображения. Ако данните ти, както предполагам са във 8 битов интерлийвнат(превеждайте си го) формат, най лесния начин е да си дефинираш един тип указател към структура от 3 8-битови числа, и да го насочиш към началото на данните.

Примерно нещо такова:

struct rgb_t {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};

void *data; //това са ти данните;
rgb_t *current_pixel = (rgb_t *)data;

for (int i = 0; i < num_pixels; i++) {
  // Към този момент current_pixel->red, current_pixel->green, current_pixel->blue сочат към съответните канали 
  // на iтия пиксел и може да си ги разделиш в три други масива примерно или да ги записваш последователно в три файла.
  current_pixel++;
}
  

Естествено, зависи от това какъв тип входни данни се ползва. Също, в зависимост от компилатора структурата е хубаво да е пакетирана, да не я закръгли на дума.

Редактирано от flare (преглед на промените)

  • Автор
преди 10 минути, flare написа:

Малко ми е странно какво значи "представено в LCD мониторите", или (освен ако не говорим за фърмуеър) какво общо има вида на монитора със изображението ама айде.

Но поне формата, в който са представени данните известен ли ти е? Повечето текущо ползвани монитори показват 8 битови RGB изображения. Ако данните ти, както предполагам са във 8 битов интерлийвнат(превеждайте си го) формат, най лесния начин е да си дефинираш един тип указател към структура от 3 8-битови числа, и да го насочиш към началото на данните.

Естествено, зависи от това какъв тип входни данни се ползва. Също, в зависимост от компилатора структурата е хубаво да е пакетирана, да не я закръгли на дума.

Темата на упражнението ни е за LCD мониторите. Не знам какво е общото с изображението. Форматът, с който са представени данните не е известен. Това, което съм написал е цялата задача. Благодаря за помощта. 

преди 4 минути, AlonsoBest написа:

Темата на упражнението ни е за LCD мониторите. Не знам какво е общото с изображението. Форматът, с който са представени данните не е известен. Това, което съм написал е цялата задача. Благодаря за помощта. 

Ми за това условие, толкова мога да кажа.

на November 12, 2016 в 16:57, flare написа:

Малко ми е странно какво значи "представено в LCD мониторите", или (освен ако не говорим за фърмуеър) какво общо има вида на монитора със изображението ама айде.

Но поне формата, в който са представени данните известен ли ти е? Повечето текущо ползвани монитори показват 8 битови RGB изображения. Ако данните ти, както предполагам са във 8 битов интерлийвнат(превеждайте си го) формат, най лесния начин е да си дефинираш един тип указател към структура от 3 8-битови числа, и да го насочиш към началото на данните.

Примерно нещо такова:


struct rgb_t {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};

void *data; //това са ти данните;
rgb_t *current_pixel = (rgb_t *)data;

for (int i = 0; i < num_pixels; i++) {
  // Към този момент current_pixel->red, current_pixel->green, current_pixel->blue сочат към съответните канали 
  // на iтия пиксел и може да си ги разделиш в три други масива примерно или да ги записваш последователно в три файла.
  current_pixel++;
}
  

Естествено, зависи от това какъв тип входни данни се ползва. Също, в зависимост от компилатора структурата е хубаво да е пакетирана, да не я закръгли на дума.

Това твърдение след знака за assignment какво прави 

rgb_t *current_pixel = (rgb_t *)data;

Защо декларираш data да е от тип войд и защо current_pixel взима адреса на data, при положение, че на data не е дефинирано къде сочи?

 

 

 

преди 54 минути, frozener написа:

Това твърдение след знака за assignment какво прави 


rgb_t *current_pixel = (rgb_t *)data;

Защо декларираш data да е от тип войд и защо current_pixel взима адреса на data, при положение, че на data не е дефинирано къде сочи?

Това е кастване към моя тип. data e void и не сочи никъде, защото това е само пример и от условието нищо не се казва откъде се взимат данните, но не исках просто да шибна някакво име на каста.. Т.е. аз съм предоставил съвсем примерен код как се очаква да се направи разделянето. Не съм претендирал за изчерпаемост.

преди 13 часа, flare написа:

Това е кастване към моя тип. data e void и не сочи никъде, защото това е само пример и от условието нищо не се казва откъде се взимат данните, но не исках просто да шибна някакво име на каста.. Т.е. аз съм предоставил съвсем примерен код как се очаква да се направи разделянето. Не съм претендирал за изчерпаемост.

Ааа вярно, че кастване било, а иначе щом ще взимаш адреса на data, според мен си трябва задължително да е от същия дата тип а не войд, защото да речем че е стринг и го въведеш, кастването едва ли ще работи.

Редактирано от frozener (преглед на промените)

преди 32 минути, frozener написа:

а иначе щом ще взимаш адреса на data, според мен си трябва задължително да е от същия дата тип а не войд, защото да речем че е стринг

Тука има две неща, които трябва да отбележим. Първо (void *) се използва точно, когато не знаем или не ни интересува типa на данните. Аз неколкократно подчертах вече, че условието изобщо не дава идея откъде идват - затова ползвах void *.  После, кастването (това на мнозина не им е особено ясно) само по себе си не променя данните, само казва на компилатора да не се оплаква (или кога да се оплаче при другите видове кастване), един вид "Знам какво правя, трай си". Специално при работа с void* е кастване е почти абсолютно задължително, защото не може да направиш много с данни без явен тип. Сега тук аз отново изрично подчертах какъв тип очаквам и затова каствам към него.

преди 26 минути, flare написа:

Тука има две неща, които трябва да отбележим. Първо (void *) се използва точно, когато не знаем или не ни интересува типa на данните. Аз неколкократно подчертах вече, че условието изобщо не дава идея откъде идват - затова ползвах void *.  После, кастването (това на мнозина не им е особено ясно) само по себе си не променя данните, само казва на компилатора да не се оплаква (или кога да се оплаче при другите видове кастване), един вид "Знам какво правя, трай си". Специално при работа с void* е кастване е почти абсолютно задължително, защото не може да направиш много с данни без явен тип. Сега тук аз отново изрично подчертах какъв тип очаквам и затова каствам към него.

Окей, ще проуча това и ще пиша ако има нещо относно имплементацията ти.

преди 30 минути, frozener написа:

Окей, ще проуча това и ще пиша ако има нещо относно имплементацията ти.

Ами с малко добавки може да го ползваш да разбиеш BMP картинка на канали. Данните в повечето BMP-та са точно така, като прескочиш хедъра.

Редактирано от flare (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.