Как отобразить цветовые составляющие картинки в Qt - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь научить себя некоторым основам теории сигналов, в частности, обработке изображений, однако я пытаюсь просто овладеть ею из первых принципов (в основном). У меня есть доступ к академической лицензии на Matlab, однако я хотел бы изучить принципы использования C / C ++ (так как он бесплатный), поэтому я выбрал IDE: Qt.

Мой текущий проект - читать визображение, используя QImage, а затем отобразите красные, зеленые и синие «части изображения». Однако я не уверен, как это сделать с помощью Qt. Моя идея заключается в следующем;при отображении красной части установите все зеленые и синие значения для всех пикселей на ноль и отобразите выходные данные, а затем повторите для каждого цветового компонента.

QImage my_original_image;
my_original_image.load(":/pic.png");

ui->img_label->setPixmap(QPixmap::fromImage(my_original_image));

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

for (int row=0; row<my_original_image.width(); row++)
{
    for (int col=0; col<my_original_image.height(); col++)
    {
        int r = qRed(my_original_image.pixel(row,col));
        qDebug() << "red " << r <<endl;
        std::cout << r << std::endl;
    }
}

Приведенный выше фрагмент кода - это то, что мне удалось собрать из других форумов, и все, что он делает, это отображает значение красного цвета для всех пикселей вкартина.

При этом мой вопрос: как я могу изменить приведенный выше код для отображения красной, зеленой и синей «частей изображения» в метке, подобной 1-му фрагменту кода?

1 Ответ

2 голосов
/ 01 октября 2019

То, что вы ищете, - это разделение компонентов RGB на отдельные изображения.

Один из способов сделать это (не очень эффективный, но соответствующий вашему предыдущему коду) - это:

QImage red(img.size(), QImage::Format_ARGB32); // a new image with the same size
for (int row = 0; row < img.height(); ++row) {
  for (int col = 0; col < img.width(); ++col) {
    const auto color = img.pixelColor(col, row);
    const auto c = color.red();
    red.setPixelColor(col, row, QColor(c, 0, 0, c > 0 ? color.alpha() : 0));
  }
}
ui->imgRed->setPixmap(QPixmap::fromImage(red));

Настройка в альфа-канале только для целей визуализации, иначе у вас будет черный цвет в тех пикселях, где красный компонент равен 0;если это то, что вам нужно, замените c > 0 ? color.alpha() : 0 только альфа-каналом исходного изображения color.alpha().

. То же самое можно повторить с остальными зелеными и синими компонентами.

enter image description here

Настройте формат изображения и удалите альфа-канал, если его нет в изображении.

PS: просто как примечание, вы меняли значение col и row переменных, вы должны использовать строки при перемещении сверху вниз (высота) и столбцы при использовании ширины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...