Qt图像处理技术二:对QImage图片简单滤镜(暖色,冷色,反色,老照片,灰度)
列举单色滤镜
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 = (R299+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图片简单滤镜(暖色,冷色,反色,老照片,灰度)的更多相关文章
- Python+OpenCV图像处理(二)——打印图片属性、设置图片存储路径、电脑摄像头的调取和显示
一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的Python科学计算库 ...
- c语言数字图像处理(二):图片放大与缩小-双线性内插法
图像内插 假设一幅大小为500 * 500的图像扩大1.5倍到750 * 750,创建一个750 * 750 的网格,使其与原图像间隔相同,然后缩小至原图大小,在原图中寻找最接近的像素(或周围的像素) ...
- GDI+图形图像处理技术中Pen和Brush的简单使用和简单图形的绘制(C#)
1.Graphics Graphics对象是GDI+绘图表面,因此在Windows窗体应用程序中要使用GDI+创建绘图,必须要先创建Graphics.在给窗体注册一个Paint事件后,Graphics ...
- iOS摇一摇功能、震动功能、简单的摇动动画、生成二维码图片与发送短信等几个功能
有一个开锁的功能,具体的需求就类似于微信的"摇一摇"功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最 ...
- iOS几个功能:1.摇一摇;2.震动;3.简单的摇动动画;4.生成二维码图片;5.发送短信;6.播放网络音频等
有一个开锁的功能,具体的需求就类似于微信的“摇一摇”功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最简单的功能了. 在v ...
- Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解
前话 Qt的图形视图框架,最核心的三个类为:QGraphicsScene.QGraphicsItem与QGraphicsView. 基于图形框架的高级白板软件Demo QGraphicsSce ...
- asp.net.web如何简单生成和保存二维码图片的例子
首先,要有生成二维码图片,需要二维码生成的类库,到官网下载thoughtWorks.QRCode.dll 例子的步骤: 1.创建项目QRCodeTest1,选择asp.net.web窗体应用程序
- 搭建Android+QT+OpenCV环境,实现“单色图片着色”效果
OpenCV是我们大家非常熟悉的图像处理开源类库:在其新版本将原本在Contrib分库中的DNN模块融合到了主库中,并且更新了相应文档.这样我们就能够非常方便地利用OpenCV实 ...
- HTML5图形图像处理技术研究
摘要:图形图像处理平台大部分是传统的C/S架构的桌面应用程序,维护困难,共享性差,而B/S架构的Web程序具有易维护.易共享的优点.本文研究了基于HTML5的Web图形图像处理技术,用HTML5实现了 ...
- FPGA与数字图像处理技术
数字图像处理方法的重要性源于两个主要应用领域: 改善图像信息以便解释. 为存储.传输和表示而对图像数据进行处理,以便于机器自动理解. 图像处理(image processing): 用计算机对图像进行 ...
随机推荐
- CF2018C Tree Pruning
分析 好像官方题解是反向求解的,这里提供一个正向求解的思路,即直接求出最后所有叶节点到根的距离相同为 \(x\) 时需要删除的结点数 \(ans_x\) . 如果我们最后到根的相同距离为 \(x\), ...
- python实现批量自动访问站点URL并获取内容,自动模拟打开电脑端及移动端URL访问站点,打开URL页面获取页面内容
问题描述:假设目前有多个网站URL,需要检查各站点keyword,description是否正常设置,如果人工逐个打开URL访问比较耗时,故采用python模拟电脑端和移动端自动打开网站URL访问,并 ...
- 结构化语句header nav aside main article section footer
点击查看代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- 分布式锁—7.Curator的分布式锁
大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphor ...
- gorm stdErr = sql: Scan error on column index 0, name "total": converting NULL to float64 is unsupported
前言 使用 gorm 查询时,报错:stdErr = sql: Scan error on column index 0, name "total": converting NUL ...
- postman发送数组
postman发送数组 第一种 第二种
- PLSQL中查询数据的时候查询结果显示中文乱码
要需要很努力才能看起来毫不费力.....1.在PLSQL中查询数据的时候查询结果显示中文乱码这里写图片描述2.需要在环境变量中新建两个环境变量:第一个:设置 NLS_LANG=SIMPLIFIED C ...
- BUUCTF---signin
题目 welcome to crypto world!! 密文:424a447b57653163306d655f74345f424a444354467d 解题 啥也没有只有一段密文,只能从密文下手了, ...
- Visual Studio 自定义项目模版
以 Visual Studio 2017 为例. 在 Visual Studio 中用户项目模版就是我们俗称的自定义项目模版. 用户项目模版位置 在Visual Studio中打开[工具-选项-项目和 ...
- Visual Studio Browser Link
用Visual Studio 2013 | 2015(不知道其他版本会不会)创建的项目(WebForm & MVC), 直接运行访问的页面源码会出现如下内容: 而这个莫名其妙多出来的Visua ...