300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 【QT数字图像处理】(四)hsv颜色空间转rgb颜色空间

【QT数字图像处理】(四)hsv颜色空间转rgb颜色空间

时间:2020-12-21 13:18:25

相关推荐

【QT数字图像处理】(四)hsv颜色空间转rgb颜色空间

一、颜色模型

1.1 rgb颜色模型

1.2 hsv颜色模型

hsv颜色模型具有以下优点:

1.符合人眼对颜色的感觉;

2.hsv颜色模型中hsv三个坐标是相互独立的:当采用rgb颜色模型时,改变某一颜色的属性,比如改变色调就必须改变rgb三个坐标;而采用hsv颜色模型时只需改变h坐标;

3.HSV颜色模型构成的是一个均匀的颜色空间,采用线性的标尺,彩色之间感觉上的距离与HSV颜色模型坐标上点的欧几里德距离成正比。

二、hsv转rgb算法(数学公式法)

三、实验一

通过拖动hsv三个滑块,计算与hsv对应的rgb三个分量,并显示在对应的文本框中。根据rgb三个分量的值,改变界面上方文本框的背景颜色。(注意:因为qt中滑块移动步长只能为整数,所以在ui界面中设置sv两个分量的滑动范围是[0, 100],在程序编写中,要将通过滑块滑动得到的值除以100)

3.1 ui设计

3.2 代码实现

.h文件

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();typedef struct{float h;float s;float v;}color_hsv_t;color_hsv_t hsv_t;typedef struct{uchar r;uchar g;uchar b;}color_rgb_t;color_rgb_t rgb_t;void hsv2rgb(color_hsv_t* hsv, color_rgb_t* rgb);private slots:void on_horizontalSlider_valueChanged(int value);void on_horizontalSlider_2_valueChanged(int value);void on_horizontalSlider_3_valueChanged(int value);private:Ui::MainWindow *ui;};#endif // MAINWINDOW_H

.c文件

#include "mainwindow.h"#include "ui_mainwindow.h"#include <QString>#include "math.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);QString h = QString::number(ui->horizontalSlider->value());QString s = QString::number(ui->horizontalSlider_2->value());QString v = QString::number(ui->horizontalSlider_3->value());ui->textEdit->setText(h);ui->textEdit_2->setText(s);ui->textEdit_3->setText(v);hsv_t.h = ui->horizontalSlider->value();hsv_t.s = ui->horizontalSlider_2->value()/100.0;hsv_t.v = ui->horizontalSlider_3->value()/100.0;hsv2rgb(&hsv_t, &rgb_t);QString r = QString::number(rgb_t.r);QString g = QString::number(rgb_t.g);QString b = QString::number(rgb_t.b);ui->textEdit_4->setText(r);ui->textEdit_5->setText(g);ui->textEdit_6->setText(b);QString style = "background-color: rgb("+ r +","+ g +","+ b +");";ui->textBrowser->setStyleSheet(style);}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_horizontalSlider_valueChanged(int value){QString h = QString::number(ui->horizontalSlider->value());QString s = QString::number(ui->horizontalSlider_2->value());QString v = QString::number(ui->horizontalSlider_3->value());ui->textEdit->setText(h);ui->textEdit_2->setText(s);ui->textEdit_3->setText(v);hsv_t.h = ui->horizontalSlider->value();hsv_t.s = ui->horizontalSlider_2->value()/100.0;hsv_t.v = ui->horizontalSlider_3->value()/100.0;hsv2rgb(&hsv_t, &rgb_t);QString r = QString::number(rgb_t.r);QString g = QString::number(rgb_t.g);QString b = QString::number(rgb_t.b);ui->textEdit_4->setText(r);ui->textEdit_5->setText(g);ui->textEdit_6->setText(b);QString style = "background-color: rgb("+ r +","+ g +","+ b +");";ui->textBrowser->setStyleSheet(style);}void MainWindow::on_horizontalSlider_2_valueChanged(int value){QString h = QString::number(ui->horizontalSlider->value());QString s = QString::number(ui->horizontalSlider_2->value());QString v = QString::number(ui->horizontalSlider_3->value());ui->textEdit->setText(h);ui->textEdit_2->setText(s);ui->textEdit_3->setText(v);hsv_t.h = ui->horizontalSlider->value();hsv_t.s = ui->horizontalSlider_2->value()/100.0;hsv_t.v = ui->horizontalSlider_3->value()/100.0;hsv2rgb(&hsv_t, &rgb_t);QString r = QString::number(rgb_t.r);QString g = QString::number(rgb_t.g);QString b = QString::number(rgb_t.b);ui->textEdit_4->setText(r);ui->textEdit_5->setText(g);ui->textEdit_6->setText(b);QString style = "background-color: rgb("+ r +","+ g +","+ b +");";ui->textBrowser->setStyleSheet(style);}void MainWindow::on_horizontalSlider_3_valueChanged(int value){QString h = QString::number(ui->horizontalSlider->value());QString s = QString::number(ui->horizontalSlider_2->value());QString v = QString::number(ui->horizontalSlider_3->value());ui->textEdit->setText(h);ui->textEdit_2->setText(s);ui->textEdit_3->setText(v);hsv_t.h = ui->horizontalSlider->value();hsv_t.s = ui->horizontalSlider_2->value()/100.0;hsv_t.v = ui->horizontalSlider_3->value()/100.0;hsv2rgb(&hsv_t, &rgb_t);QString r = QString::number(rgb_t.r);QString g = QString::number(rgb_t.g);QString b = QString::number(rgb_t.b);ui->textEdit_4->setText(r);ui->textEdit_5->setText(g);ui->textEdit_6->setText(b);QString style = "background-color: rgb("+ r +","+ g +","+ b +");";ui->textBrowser->setStyleSheet(style);}/** h[0, 360]* s[0, 1]* v[0, 1]*/void MainWindow::hsv2rgb(color_hsv_t* hsv, color_rgb_t* rgb){int i;float f, a, b, c;float h = hsv->h;float s = hsv->s;float v = hsv->v;if(h >= 360){h = 0;}if(s == 0){rgb->r = (uchar)(v*255);rgb->g = (uchar)(v*255);rgb->b = (uchar)(v*255);}else{h /= 60.0;i = (int)floor(h);f = h - i;a = v*(1-s);b = v*(1-s*f);c = v*(1-s*(1-f));switch(i) {case 0:rgb->r = (uchar)((int)(v*255)); //v*255rgb->g = (uchar)((int)(c*255)); //c*255;rgb->b = (uchar)((int)(a*255)); //a*255;break;case 1:rgb->r = (uchar)((int)(b*255)); //b*255;rgb->g = (uchar)((int)(v*255)); //v*255;rgb->b = (uchar)((int)(a*255)); //a*255;break;case 2:rgb->r = (uchar)((int)(a*255)); //a*255;rgb->g = (uchar)((int)(v*255)); //v*255;rgb->b = (uchar)((int)(c*255)); //c*255;break;case 3:rgb->r = (uchar)((int)(a*255));//a*255;rgb->g = (uchar)((int)(b*255));//b*255;rgb->b = (uchar)((int)(v*255));//v*255;break;case 4:rgb->r = (uchar)((int)(c*255)); //c*255;rgb->g = (uchar)((int)(a*255)); //a*255;rgb->b = (uchar)((int)(v*255)); //v*255;break;default:rgb->r = (uchar)((int)(v*255)); //v*255;rgb->g = (uchar)((int)(a*255)); //a*255;rgb->b = (uchar)((int)(b*255)); //b*255;break;}}}

3.3 实验效果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。