列举单色滤镜

1.暖色
2.冷色
3.反色
4.老照片
5.灰度

github代码(持续更新)

期待你的小星星
github:https://github.com/dependon/simple-image-filter //qt美颜滤镜

Bound函数,防止越界

int Bound(int range_left, int data, int range_right)
{
int index = data;
if (data > range_right) {
index = range_right;
} else if (data < range_left) {
index = range_left;
}
return index;
}

暖色滤镜

原理如下:
​ 这里红绿越高,颜色越暖,蓝色越高,图片色彩越冷,所以算法为红色和绿色按固定数值增加,蓝色不变。
red=red+30;
green=green+30;

QImage warnImage(const QImage &img, int index)
{
QImage imgCopy;
if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
if (nullptr == rgb) {
return QImage();
}
QColor frontColor;
int size = img.width() * img.height(); for (int i = 0; i < size ; i++) {
int r = rgb[i * 3] + index;
int g = rgb[i * 3 + 1] + index;
int b = rgb[i * 3 + 2] ; rgb[i * 3] = r > 255 ? 255 : r;
rgb[i * 3 + 1] = g > 255 ? 255 : g;
rgb[i * 3 + 2] = b > 255 ? 255 : b;
} return imgCopy;
}

冷色滤镜


原理如下:
这里红绿越高,颜色越暖,蓝色越高,图片色彩越冷,所以算法为红色和绿色不变,蓝色增加30。
blue=blue+30

QImage coolImage(const QImage &img,  int index)
{ QImage imgCopy;
if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
if (nullptr == rgb) {
return QImage();
}
QColor frontColor;
int size = img.width() * img.height(); for (int i = 0; i < size ; i++) {
int r = rgb[i * 3] ;
int g = rgb[i * 3 + 1] ;
int b = rgb[i * 3 + 2] + index; rgb[i * 3] = r > 255 ? 255 : r;
rgb[i * 3 + 1] = g > 255 ? 255 : g;
rgb[i * 3 + 2] = b > 255 ? 255 : b;
} return imgCopy;
}

灰度滤镜


原理如下:
​ 任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:
  1.浮点算法:Gray = R0.3 + G0.59 + B0.11
  2.整数方法:Gray = (R
299+G587+B114)/1000
  3.移位方法:Gray =(R28+G151+B*77)>> 8
  4.平均值法:Gray = (R+G+B)/3
  5.仅取绿色:Gray = G
  通过以上任何一种方法求得Gray后,将原来的RGB(r,g,b)中的r,g,b统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(r,g,b)就是灰度图了。
这里采用平均值算法和整数算法

//方案1
QImage GreyScale(const QImage &img)
{
QImage imgCopy; if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
int size = img.width() * img.height();
for (int i = 0; i < size ; i++) {
int average = (rgb[i * 3] * 299 + rgb[i * 3 + 1] * 587 + rgb[i * 3 + 1] * 114 + 500) / 1000;
rgb[i * 3] = average;
rgb[i * 3 + 1] = average;
rgb[i * 3 + 2] = average;
}
return imgCopy; }
//方案2 QImage QImageAPI::GrayScaleImage(const QImage &img)
{ QImage imgCopy;
if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
if (nullptr == rgb) {
return QImage();
}
QColor frontColor;
int size = img.width() * img.height(); for (int i = 0; i < size ; i++) {
int average = (rgb[i * 3] + rgb[i * 3 + 1] + rgb[i * 3 + 2]) / 3;
rgb[i * 3] = average > 255 ? 255 : average;
rgb[i * 3 + 1] = average > 255 ? 255 : average;
rgb[i * 3 + 2] = average > 255 ? 255 : average;
}
return imgCopy;
}

老照片滤镜


原理如下:
该点red值 =0.393x该点red值+0.769x该点green值+0.189x该点blue值
该点green值 =0.349x该点red值+0.686x该点green值+0.168x该点blue值
该点blue值 =0.272x该点red值+0.534x该点green值+0.131x该点blue值
如果遇到超过255的情况,取最大值255

QImage oldImage(const QImage &img)
{
QImage imgCopy;
if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
if (nullptr == rgb) {
return QImage();
} int size = img.width() * img.height();
for (int i = 0; i < size ; i++) {
float r = 0.393 * rgb[i * 3] + 0.769 * rgb[i * 3 + 1] + 0.189 * rgb[i * 3 + 2];
float g = 0.349 * rgb[i * 3] + 0.686 * rgb[i * 3 + 1] + 0.168 * rgb[i * 3 + 2];
float b = 0.272 * rgb[i * 3] + 0.534 * rgb[i * 3 + 1] + 0.131 * rgb[i * 3 + 2];
r = Bound(0, r, 255);
g = Bound(0, g, 255);
b = Bound(0, b, 255);
rgb[i * 3] = r;
rgb[i * 3 + 1] = g ;
rgb[i * 3 + 2] = b ;
}
return imgCopy;
}

反色滤镜

原理如下:
每个点的rgb色都变成
该点red值=255-该点red值;
该点green值=255-该点green值;
该点blue值=255-该点blue值;

QImage QImageAPI::InverseColorImage(const QImage &img)
{
QImage imgCopy;
if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
if (nullptr == rgb) {
return QImage();
} int size = img.width() * img.height();
for (int i = 0; i < size ; i++) {
rgb[i * 3] = 255 - rgb[i * 3] ;
rgb[i * 3 + 1] = 255 - rgb[i * 3 + 1] ;
rgb[i * 3 + 2] = 255 - rgb[i * 3 + 2] ;
}
return imgCopy;
}

Qt图像处理技术二:对QImage图片简单滤镜(暖色,冷色,反色,老照片,灰度)的更多相关文章

  1. Python+OpenCV图像处理(二)——打印图片属性、设置图片存储路径、电脑摄像头的调取和显示

    一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的Python科学计算库 ...

  2. c语言数字图像处理(二):图片放大与缩小-双线性内插法

    图像内插 假设一幅大小为500 * 500的图像扩大1.5倍到750 * 750,创建一个750 * 750 的网格,使其与原图像间隔相同,然后缩小至原图大小,在原图中寻找最接近的像素(或周围的像素) ...

  3. GDI+图形图像处理技术中Pen和Brush的简单使用和简单图形的绘制(C#)

    1.Graphics Graphics对象是GDI+绘图表面,因此在Windows窗体应用程序中要使用GDI+创建绘图,必须要先创建Graphics.在给窗体注册一个Paint事件后,Graphics ...

  4. iOS摇一摇功能、震动功能、简单的摇动动画、生成二维码图片与发送短信等几个功能

    有一个开锁的功能,具体的需求就类似于微信的"摇一摇"功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最 ...

  5. iOS几个功能:1.摇一摇;2.震动;3.简单的摇动动画;4.生成二维码图片;5.发送短信;6.播放网络音频等

    有一个开锁的功能,具体的需求就类似于微信的“摇一摇”功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最简单的功能了. 在v ...

  6. Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解

    前话   Qt的图形视图框架,最核心的三个类为:QGraphicsScene.QGraphicsItem与QGraphicsView.   基于图形框架的高级白板软件Demo QGraphicsSce ...

  7. asp.net.web如何简单生成和保存二维码图片的例子

    首先,要有生成二维码图片,需要二维码生成的类库,到官网下载thoughtWorks.QRCode.dll 例子的步骤: 1.创建项目QRCodeTest1,选择asp.net.web窗体应用程序

  8. 搭建Android+QT+OpenCV环境,实现“单色图片着色”效果

               OpenCV是我们大家非常熟悉的图像处理开源类库:在其新版本将原本在Contrib分库中的DNN模块融合到了主库中,并且更新了相应文档.这样我们就能够非常方便地利用OpenCV实 ...

  9. HTML5图形图像处理技术研究

    摘要:图形图像处理平台大部分是传统的C/S架构的桌面应用程序,维护困难,共享性差,而B/S架构的Web程序具有易维护.易共享的优点.本文研究了基于HTML5的Web图形图像处理技术,用HTML5实现了 ...

  10. FPGA与数字图像处理技术

    数字图像处理方法的重要性源于两个主要应用领域: 改善图像信息以便解释. 为存储.传输和表示而对图像数据进行处理,以便于机器自动理解. 图像处理(image processing): 用计算机对图像进行 ...

随机推荐

  1. python文件不显示cmd黑窗口,打包py,pyw文件为exe文件

    问题描述:编写的python文件为定时任务,需要长时间运行,但是打开的cmd黑色窗口看起来很不舒服,于是打包为exe文件,隐藏cmd黑色窗口 步骤:1.使用pip install pyinstalle ...

  2. Swagger OpenAPI Schema 为空时 Example Value 显示 "string" 的原因及解决方案

    解决Swagger UI示例值显示"string"的问题 最近在使用ObjectScript生成JSON接口文档时,遇到了一个奇怪的问题: 生成的JSON数据是正常的. 但Swag ...

  3. PPT-嵌入字体提示不可嵌入怎么办

    直接将不可嵌入的字体替换为可以嵌入的字体 开始->替换->替换字体

  4. 前缀函数和 KMP "跳步骤"模式匹配

    在一篇由字符构成的长文中查找另一个短字符串出现的位置,这可以算是编程领域最最常见的问题(比如按下 Ctrl + F 就可以打开你浏览器的查找功能).这个问题叫做字符串的模式匹配,我们把被查找的关键词叫 ...

  5. Oracle使用Impdp导入dmp文件的详细过程

    这一天为了导入这个Oracle的dmp文件,简直就是血泪史,因本人对Oracle并不是很会,随意踩了很多小白会踩的坑,因此特意记录一下过程,防备下次的使用. 1.首先将你需要的dmp文件准备好,将其放 ...

  6. Clion搭建C语言开发环境

    1.下载和安装MinGW 1)下载链接:http://www.mingw.org/ 2)选择安装目录,目录尽可能简单(如:D:\MinGW)且不要包含中文和空格 3)添加相关的包 所需的包如下:min ...

  7. Eclipse 安装 阿里P3C编码规范插件

    操作:Help -> Install New Software -> add name: p3c location:https://p3c.alibaba.com/plugin/eclip ...

  8. SpringBoot整合Redis日志反复提示Redis重连问题

    1. 报错信息如图: 2. 原因: spring boot 2.0之后spring-boot-starter-data-redis默认不再使用jedis连接redis,而是lettuce 这是lett ...

  9. 基于Zookeeper实现调度任务选主及心跳检测

    在微服务架构中使用ZooKeeper实现分布式任务调度选主,并确保Follower节点能实时监控Master状态并及时触发重新选举,可以通过以下方案实现: 一.核心设计原理 1. ZooKeeper特 ...

  10. Asp.net mvc基础(六)TempData

    在客户端重定向或验证码等情况下,由于要跨请求的存取数据,是不能放到ViewBag.Model中,需要"暂时存到Session中,用完了删除"的需求:使用TempData可以做到. ...