Amritanshu Pandia Ответов: 3

как преобразовать цветное изображение в оттенки серого в C или C++


как преобразовать цветное изображение в оттенки серого в C или C++ ?
Все присутствующие здесь потоки дают решение на языке Си#

3 Ответов

Рейтинг:
27

Eugen Podsypalnikov

:) :

0. Любой цвет может быть представлен в виде 3D-вектора с координатами (r, g, b)
1. По любому ж/б цвет является достоверным (р == г == Б)
2. Любой вектор имеет длину
3. Любой преобразованный вектор w/b имеет ту же длину, что и исходный
4. Любой пиксел имеет цвет

Смотреть также[^]

void convert(CImage* pcImage)
{
  ASSERT(pcImage);

  int iWidth(pcImage->GetWidth());
  int iHeight(pcImage->GetHeight());
  
  if (iWidth && iHeight) {
    for (int i = 0; i < iWidth; i++) {
      for (int j = 0; j < iHeight; j++) {
        COLORREF clrOriginal(pcImage->GetPixel(i, j));
        float fR(GET_R(clrOriginal));
        float fG(GET_G(clrOriginal));
        float fB(GET_B(clrOriginal));

        float fWB = sqrt((fR * fR + fG * fG + fB * fB) /3);
        pcImage->SetPixel(i, j, RGB(fWB, fWB, fWB));
      }
    }
  }
}


Amritanshu Pandia

можете ли вы предоставить код на языке C или C++ для преобразования цветного изображения в оттенки серого

CPallini

Я бы так и сделал
fWB = sqrt(fR * fR + fG * fG + fB * fB)/3;
вместо.

Eugen Podsypalnikov

Спасибо,

но 3*(fWB * fWB) = (fR * fR + fG * fG + fB * fB) , не так ли ? :)

CPallini

Извини, не бери в голову. Мне нужно больше кофеина.

Espen Harlinn

5 ЕД!

thatraja

5!

Рейтинг:
18

Espen Harlinn

5 ЕД!

JackDingler

Обратите внимание, что каждый элемент цвета имеет коэффициент, определяющий, сколько входных данных он должен иметь в конечном значении пикселя.

Однако следующий код напрашивается на оптимизацию. Здесь нет необходимости использовать математику с плавающей запятой.
byColor = ( GetRValue(cr) * 0.30 ) +
( GetGValue(cr) * 0.59 ) +
( GetBValue(cr) * 0.11 );

Мы можем сделать это со всеми целыми числами. Мы можем умножить коэффициенты на 1024, затем сделать математику и сдвиг на 10, чтобы подделать деление на 1024...
byColor = (((int) GetRValue(cr) * 307 ) +
( (int) GetGValue(cr) * 604 ) +
( (int) GetBValue(cr) * 113 )) >> 10;

Рейтинг:
0

Member 13820371

"Точными" цветовыми весами являются:
0.299083 0.585841 0.114076