嵌入式人工智能应用
嵌入式人工智能应用-第三章 opencv操作5 图像的基本处理
5 图像处理
5.1 图像处理基础概念
5.1.1 绘图
OpenCV 有绘图函数,可以把想要的图形直接绘制到图像上,提供了绘制直线的接口 line(),绘制箭头的接口 arrowedLine(),绘制矩形的接口 rectangle(),绘制圆的接口 circle(),绘制椭圆的接口 ellipse(),填充多边形接口 fillConvexPoly(),绘制轮廓的接口 drawContours(),绘制文字的接口 putText()。基于 OpenCV提供的这些绘图接口,将他们合理并用,就可以绘制出各类山水画、文字画等。
5.1.2 灰度处理
图像灰处理即是将一幅彩色图像转换为灰度化图像的过程。彩色图像通常包括 R、G、B 三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色图像的 R、G、B 三个分量相等的过程。灰度图像中每个像素仅具有一种样本颜色,其灰度是位于黑色与白色之间的多级色彩深度,灰度值大的像素点比较亮,反之比较暗,像素值最大为 255(表示白色),像素值最小为 0(表示黑色)。灰度处理有很多中方法,例如一张彩色图片,OpenCV 在读取这张图片的时候就可以直接读取为灰度图像。还可以调用 OpenCV 提供的 cvtColor 接口进行灰度处理(前面的实验中已经用到了)。还可以使用平均值法、最大值法、分量法、加权平均法等让一张彩色的图片转换成灰度图像。
5.1.3 二值化
二值化是图像分割的一种重要方法,图像的二值化就是将图像的表示方法缩减成两种状态,要么是 0,要么是 1,对于肉眼看到的就是非黑即白。一幅彩色图像,比如是 RGB888 的,则有 R/G/B 三个通道,每个通道的位深都是 8,所以 R、G、B 都有 0 到 255 的变化空间,表现出来的就是 256 种颜色。三个通道柔和在一起表示一个像素点,就有 224 种颜色。灰度图像是将 RGB 三个通道缩减到一个通道,于是他的变化空间就是 0 到 255,也就是 256 种颜色。二值图像就是将变化范围缩减到 0 到 1,也就是 2 种颜色。
5.1.4 图片的缩放
在计算机图像处理和计算机图形学中,图像缩放(image scaling)是指对数字图像的大小进行调整的过程。图像缩放是一种非平凡的过程,需要在处理效率以及结果的平滑度(smoothness)和清晰度(sharpness)上做一个权衡。当一个图像的大小增加之后,组成图像的像素的可见度将会变得更高,从而使得图像表现得粗糙。相反地,缩小一个图像将会增强它的平滑度和清晰度,让图像看起来更加细腻。OpenCV 提供的 Resize() 函数非常方便而且效率也非常高。
5.1.5 马赛克
马赛克指现行广为使用的一种图像(视频)处理手段,此手段将影像特定区域的色阶细节劣化并造成色块打乱的效果,因为这种模糊看上去有一个个的小格子组成,便形象的称这种画面为马赛克。其目的通常是使之无法辨认。要实现图像的马赛克效果,我们只需要设置一个像素块,并将该像素块中的所有像素都使用同一个 bgr 值来表示。图像进行马赛克处理的时候,如果像素块设置得相对比较小,将图像拿得足够
远,无法起到马赛克的效果
5.2 绘图
#include<opencv2/opencv.hpp>
using namespace cv;
int main(void)
{
Mat img = Mat(480, 800, CV_8UC3, Scalar(255, 255, 255));
circle(img, Point(400, 260), 200, Scalar(0, 0, 0), 3, 4);
circle(img, Point(285, 200), 30, Scalar(0, 0, 0), 3, 4);
circle(img, Point(495, 200), 30, Scalar(0, 0, 0), 3, 4);
ellipse(img, Point(180, 110), Size(100, 50), 90, 0, 360, Scalar(0, 0, 0), 4, 4);
ellipse(img, Point(620, 110), Size(100, 50), 90, 0, 360, Scalar(0, 0, 0), 4, 4);
rectangle(img, Point(275, 190), Point(295, 210), Scalar(0, 0, 0), 3, 4);
rectangle(img, Point(485, 190), Point(505, 210), Scalar(0, 0, 0), 3, 4);
ellipse(img, Point(395, 300), Size(80, 50), 180, 0, 360, Scalar(0, 0, 0), 4, 4);
circle(img, Point(360, 300), 15, Scalar(0, 0, 0), 3, 4);
circle(img, Point(430, 300), 15, Scalar(0, 0, 0), 3, 4);
imshow("output img", img);
waitKey(0);
return 0;
}
5.3 图像二值化
代码将一幅灰度图像进行二值化,然后显示出来。使用 OpenCV 提供的 Mat 定义两个变量,用于存储原始图像和二值化后的图像,OpenCV 提供的 imread 方法可以直接读取灰度图像,第二个参数 flag 默认是1,设置成 0 即可读取灰度图像。使用 OpenCV 提供的 threshold 方法进行二值化处理,处理结果存放在第二个参数 result 中
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
using namespace std;
int main(int argc,char* argv[])
{
Mat img;
Mat result;
img = imread("cyq.jpg",0);
namedWindow("Image");
imshow("Image", img);
threshold(img, result, 100, 255, CV_THRESH_BINARY);
imshow("output", result);
waitKey(0);
return 0;
}
5.4 图像缩放
OpenCV 提供了 pyrUp 和 pyrDown 函数,可以直接对图像进行缩放处理,需要注意图片的尺寸是 2n。
函数 pyrUp 接受 3 个参数:
tmp: 当前图像,初始化为原图像 src。
dst: 目的图像(显示图像,为输入图像的两倍)
Size( tmp.cols2, tmp.rows2 ):目的图像大小,既然我们是向上采样,pyrUp 期待一个两倍于输入图
像(tmp)的大小。
OpenCV 同样提供了 pyrDown 函数,参数的含义和 pyrUp 类似,对应的 Size 参数是除以 2,这里就不
再详细说明了。图像在缩放的过程中对像素进行了处理,所以按了 d 之后再按 u 就会发现图片不清晰,这
就是图片缩小之后产生了失真(缩放操作都会失真)。
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
using namespace cv;
Mat src, dst, tmp;
const char* window_name = "Pyramids Demo";
int main( int argc, char** argv )
{
printf( "\n Zoom In-Out demo \n " );
printf( "------------------ \n" );
printf( " * [u] -> Zoom in \n" );
printf( " * [d] -> Zoom out \n" );
printf( " * [ESC] -> Close program \n \n" );
src = imread( "cyq.jpg" );
if( !src.data ){
printf(" No data! -- Exiting the program \n");
return -1;
}
tmp = src;
dst = tmp;
namedWindow( window_name, CV_WINDOW_AUTOSIZE );
imshow( window_name, dst );
while( true )
{
int c;
c = waitKey(10);
if( (char)c == 27 )
break;
if( (char)c == 'u' ){
pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 ) );
printf( "** Zoom In: Image x 2 \n" );
}
else if( (char)c == 'd' ) {
yrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 ) );
printf( "** Zoom Out: Image / 2\n");
}
imshow( window_name, dst );
tmp = dst;
}
return 0;
}