03_数字图像处理基础与OpenCV基本图片读写

在这里插入图片描述

1.数字图像处理概述

数字图像处理是利用计算机技术或者其它数字技术对图像信息进行某些数学运算和各种加工处理,以改善图像的视觉效果和提升图像实用性的技术。它是光学、电子学、计算机科学、计算机图形学、人工智能、模式识别以及摄影技术等多学科领域的交叉技术学科,其理论体系和技术体系十分庞大和复杂。

1.1 图像是什么

图是物体反射或者透射电磁波的分布,像是人的视觉系统对接收的图像信息在大脑中形成的印象。所谓图像,就是用各种观测系统以不同的形式和手段观测世界获得的、可以直接或间接作用于人的视觉系统而产生的的视知觉实体。

1.2 图像处理又是在做什么

所谓图像处理,就是对图像信息进行加工以满足人的视觉或者相关应用需求的行为。比如传统的光学滤波、先进的激光全息技术,都是光学图像处理方法。

随着科学进步的发展,数字图像处理技术开始应用于解决机器视觉问题。在这种情况下,它的目的不再是单纯的改善图像的视觉效果和提升图像的实用性,而是把精力集中于提取图像中的某些特征,以便计算机能够自动识别图像中的目标和理解图像

1.3 图像处理技术研究的基本内容

图像处理技术研究的基本内容包括图像变换、图像增强、图像恢复、图像压缩编码、图像分割、图像特征提取、彩色图像处理和多光谱及高光谱图像处理、小波图像处理和形态学图像处理、图像的表示与描述等。

1.4 图像处理与计算机视觉

下图是冈萨雷斯对图像处理与计算机视觉的理解:

在这里插入图片描述

2.计算机中图像的表示

图像的表示是进行图像处理算法和利用计算机对其进行处理的基础和先决条件。

一幅图像可以定义成一个二维函数 f ( x , y ) f(x,y) f(x,y) 其中 x , y x,y x,y 是二维空间的坐标, f ( x , y ) f(x,y) f(x,y) 是图像中空间坐标 ( x , y ) (x,y) (x,y) 处所对应的幅值。该幅值实质上反映了图像源的辐射能量,所以它一定是非0并且有限的,即
0 < f ( x , y ) < A 0<f(x,y)<A 0<f(x,y)<A

当一幅图像的 x , y x,y xy 坐标以及幅值 f f f 都为连续量时,称该图为连续图像。为了把连续的图像转换成计算机可以接受的数字形式,需要对连续的图像进行空间和幅值上的离散化处理。其中对图像的连续空间坐标 x , y x,y xy 的离散化称为图像采样,对图像函数 f ( x , y ) f(x,y) f(x,y) 幅值 f f f 的离散化称为图像灰度级的量化。一般对二维连续图像 f ( x , y ) f(x,y) f(x,y) 的连续坐标空间 x , y x,y x,y 进行均匀采样,实质上就是把二维图像平面在 x x x 方向和 y y y 方向分别进行等间距划分,平面就被划分成了 M M M x N N N个网格。

对于单通道的灰度图来说,每个网格里的一个元素就是一个值。对于三通道的彩色图像来说,每个网格里的一个元素就是一个含RGB各自通道像素值的向量,如下图:

图片描述

因此通俗理解,一幅图像就可以理解成一个二维矩阵,设 x ∈ [ 0 , M − 1 ] , y ∈ [ 0 , N − 1 ] , f ∈ [ 0 , L − 1 ] x\in[0,M-1],y\in[0,N-1],f\in[0,L-1] x[0,M1],y[0,N1],f[0,L1],则一幅图像 f ( x , y ) f(x,y) f(x,y) 可以表达成如下一个 M M M x N N N 的二维数字阵列。
[ f ( x , y ) ] = [ f ( 0 , 0 ) f ( 0 , 1 ) . . . f ( 0 , N − 1 ) f ( 1 , 0 ) f ( 1 , 1 ) . . . f ( 1 , N − 1 ) . . . . . . . . . . . . f ( M − 1 , 0 ) f ( M − 1 , 1 ) . . . f ( M − 1 , N − 1 ) ] [f(x,y)]= \left[ \begin{matrix} f(0,0) & f(0,1) & ... & f(0,N-1)\\ f(1,0) & f(1,1) & ... & f(1,N-1) \\ ... & ... & ... & ... \\ f(M-1,0) & f(M-1,1) & ... & f(M-1,N-1) \end{matrix} \right] [f(x,y)]=f(0,0)f(1,0)...f(M1,0)f(0,1)f(1,1)...f(M1,1)............f(0,N1)f(1,N1)...f(M1,N1)

其中每个单元内的图像元素称为像素,L称为像素级,为2的整次幂,即
L = 2 k , k 为 正 整 数 . L=2^k,k为正整数. L=2k,k.

  • 当k=1时,L=2,像素值的取之范围为[0,1],因为像素值为离散值,所以只能或为1或为0,此时称为二值图像或黑白图像,所谓的二值图像就是只有两个灰度级的图像。值得注意的是,黑白图像一定是二值图像,但是二值图像未必是黑白图像。
  • 当k=8时,L=256,像素值的取之范围为[0,255],这也是目前在图像处理应用中最常用的灰度级。

3.利用OpenCV读取并显示图片

下面是通过OpenCV来读取一幅存储在计算机上的图像。

3.1相关函数介绍

读取图片
C++ API

CV_EXPORTS_W Mat imread( const string& filename, int flags=1 );

Python API:

def imread(filename, flags=None)

imread函数可以自动申请内存并且根据图像文件名以指定的格式读取指定路径的图像到计算机内存中,在C++中,该函数的返回值就是一个图像矩阵Mat,而在Python中,返回一个Numpy数组,这两个会在 下一篇: 04_OpenCV中的图像表示详解 中来详细理解。

该函数参数如下:

  • filename:要读取的图片的路径和文件名
  • flags:默认为1,表示按三通道彩色读入图像,设为0时将原图转成灰度图读入

创建窗口
C++ API

CV_EXPORTS_W void namedWindow(const string& winname, 
							   int flags = WINDOW_AUTOSIZE);

Python API:

def namedWindow(winname, flags=None)

在以前老版本的OenCV中,用一个窗口显示图像之前需要先创建窗口,然后将窗口名与显示图像函数里的窗口名参数绑定,这样可以显示图像到指定窗口。新版本的OpenCV可以直接通过显示图像函数,即imshow函数创建窗口并且显示,因此该函数可以不用而直接imshow

  • winname:创建的窗口名称,后续可以使用imshow来绑定同名窗口显示图片
  • flags:默认为WINDOW_AUTOSIZE,此时窗口大小固定同图片大小一样,设为WINDOW_NORMAL则窗口可拉伸

显示图片

C++ API

CV_EXPORTS_W void imshow(const string& winname, InputArray mat);

Python API:

def imshow(winname, mat)

imshow函数可以显示出内存中的图像数据到指定窗口。

  • winname:要显示到的窗口名
  • mat:要显示的图像矩阵

保存图片
C++ API

CV_EXPORTS_W bool imwrite( const string& filename, 
						   InputArray img,
						   const vector<int>& params=vector<int>());

Python API:

def imwrite(filename, img, params=None)

imwrite函数可以将计算机内存中的图像数据以指定的格式和文件名保存到本地。

  • filename:保存的图片文件名
  • img:要保存的图像
  • params:表示为特定格式保存的参数编码

关闭窗口
C++ API

CV_EXPORTS_W void destroyWindow(const String& winname);
CV_EXPORTS_W void destroyAllWindows();

Python API:

def destroyWindow(winname)
def destroyAllWindows()

上面的两个函数可以关闭销毁创建的窗口,其中destroyWindow()可以销毁指定窗口名的窗口,而destroyAllWindows()是直接销毁所有窗口,此函数一般用在程序的最后“收尾”。


3.2 代码实践

image_read_show_write.cpp

/*
	读取、显示、保存图片
*/

#include<iostream>
#include<opencv2\opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char**argv)
{
    
    
	//读取指定目录下的图片文件
	//flag为0则按单通道方式读取图片,得到的input为单通道
	Mat src = imread("./test_images/opencv.jpg", 0);
	if (src.empty())
	{
    
    
		cout << "load image error!" << endl;
		exit(-1);
	}
	else
	{
    
    
		//创建一个名为input的窗口并在其中显示读入的图片
		namedWindow("input_image", WINDOW_NORMAL);
		imshow("input_image", src);

		//将独到的图片保存成jpg格式
		imwrite("gray_input.jpg", src);

		waitKey(0);
	}
	return 0;
}

image_read_show_write.py:

import cv2 as cv
import numpy as np 

# 以单通道方式读取图片
input = cv.imread("./test_images/opencv.jpg",0)

#创建一个名为input的窗口并在其中显示读入的图片
cv.namedWindow("input",cv.WINDOW_NORMAL)
cv.imshow("input", input)
cv.waitKey(0)

#将读取到的图片保存成jpg格式
cv.imwrite("gray_input.jpg", input)

#销毁窗口
cv.destroyAllWindows()

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/PecoHe/article/details/102508978