【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
? ? ? ? 很多人一想到图像处理,本能的第一反应就是opencv,这也没有错。但是呢,这里面还是有一个问题的,不知道大家有没有想过,如果我们为了降低成本,需要把图像放到mcu来处理,这个时候应该怎么做呢?都知道,mcu的ram和flash都是有限的,根本无法容纳那么大的opencv库。所以,这边还是建议大家,opencv是可以用,但是基础的算法库最好还是可以自己写出来。
? ? ? ? 对于写算法的人来说,最麻烦的事情,莫过于图片的读取和保存了,算法本身一般并不是那么复杂。所以这部分好在qt已经帮我们做了一部分,我们直接拿QImage类就可以实现基础的算法编写了。
? ? ? ? qt里面的QImage十分方便,输入路径,就是实现图片的保存和加载。
? ? ? ? 如下面代码所示,这就是一个简单的图像处理代码,将原来的彩色图片,变成了灰色图片。整个应用没有界面,就是一个单纯的应用。所有的操作都放在了processImage函数里面。
#include <QImage>
#include <QDebug>
void processImage(QString inputPath, QString outputPath)
{
// load image
QImage inputImage(inputPath);
if (inputImage.isNull())
{
qDebug() << "Failed to load image";
return;
}
// get image infor
int width = inputImage.width();
int height = inputImage.height();
// loop to process pixel
for (int y = 0; y < height; ++y)
{
for (int x = 0; x < width; ++x)
{
QRgb pixel = inputImage.pixel(x, y);
// get data
int red = qRed(pixel);
int green = qGreen(pixel);
int blue = qBlue(pixel);
// get gray
int gray = qGray(red, green, blue);
// set gray
inputImage.setPixel(x, y, qRgb(gray, gray, gray));
}
}
// save data
if (!inputImage.save(outputPath))
{
qDebug() << "Failed to save processed image";
}
}
int main()
{
// set input and output path
QString inputPath = "D:/lena.png";
QString outputPath = "D:/lena_new.png";
// process image
processImage(inputPath, outputPath);
return 0;
}
? ? ? ? 代码中因为还涉及到调试的部分,所以除了QImage之外,还需要把QDebug头文件包括进来。首先用QImage导入路径,判断是否为空,不为空则继续处理。接着获取图片的宽度和高度,依次获取图片的每个像素QRgb。读取到r、g、b之后,就可以通过qGray计算出对应的灰度值gray,这样最基本的算法就写好了。计算出来的gray通过setPixel保存在inputImage当中,并且在所有操作都完成之后,save到新的路径下面,这样图像处理就算是ok了。
? ? ? ? 记得读书的时候,有一门《数字图像处理》的课程。老师们为了方便同学们快速学习算法,很多图片的加载和读取工作,老师们会自己写一个动态库帮忙完成。现在有了QImage之后,无疑是更方便了。对于基础的算法,大家还是最好自己可以写出来、调试出来。
? ? ? ? 对于这个应用,大家先看一下能不能编译出来。编译出来之后,还要准备一张lena.png的图片,可以从这个地方下载,
https://github.com/mikolalysenko/lena/blob/master/lena.png
? ? ? ? 接着启动应用,开始单步调试,如果没啥问题,应该就可以在D盘看到生成的新图片,打开看一下,如果发现是灰度图,那基本代表没有什么问题了。