读取、显示和写入图像
是图像处理和计算机视觉的基础。即使在剪切、调整大小、旋转或应用不同的过滤器来处理图像时,你也需要先读取图像。所以掌握这些基本运算是很重要的。
世界上最大的计算机视觉库OpenCV有这三个内置功能,让我们来看看它们到底是做什么的:
Imread()
帮助我们读取图像mshow()
在窗口中显示图像imwrite()
将图像写入文件目录我们将使用下图来演示这里的所有函数
首先,看一看这个代码示例。它读取并显示上面的图像。看它是如何包含我们刚刚提到的所有三个函数的。随着您的深入,我们将讨论这个实现中使用的每一个函数。
# import the cv2 library
import cv2
# The function cv2.imread() is used to read an image.
img_grayscale = cv2.imread('test.jpg',0)
# The function cv2.imshow() is used to display an image in a window.
cv2.imshow('graycsale image',img_grayscale)
# waitKey() waits for a key press to close the window and 0 specifies indefinite loop
cv2.waitKey(0)
# cv2.destroyAllWindows() simply destroys all the windows we created.
cv2.destroyAllWindows()
# The function cv2.imwrite() is used to write an image.
cv2.imwrite('grayscale.jpg',img_grayscale)
//Include Libraries
#include
#include
// Namespace nullifies the use of cv::function();
using namespace std;
using namespace cv;
// Read an image
Mat img_grayscale = imread("test.jpg", 0);
// Display the image.
imshow("grayscale image", img_grayscale);
// Wait for a keystroke.
waitKey(0);
// Destroys all the windows created
destroyAllWindows();
// Write the image in the same directory
imwrite("grayscale.jpg", img_grayscale);
我们从导入Python和c++的OpenCV库开始(如下所示)。
# import the cv2 library
import cv2
在c++中,使用#include(如下所示)来完成相同的任务。还可以为它指定namespaces
,从而直接引用函数名称。不需要在它们前面加上名称空间(例如,你可以直接使用read()
而不是cv::imread()
)。
//Include Libraries
#include
#include
// Namespace nullifies the use of cv::function();
using namespace std;
using namespace cv;
读取图像时,使用OpenCV中的imread()函数。这里的语法:
imread(filename, flags)
它有两个参数:
cv2.IMREAD_UNCHANGED or -1
cv2.IMREAD_GRAYSCALE or 0
cv2.IMREAD_COLOR or 1
flags
的默认值是1
,它将在图像中读取为彩色图像。当您希望以特定格式读取图像时,只需指定适当的标志。
在这一点上还需要注意的是,OpenCV
以BGR
格式读取彩色图像,而大多数其他计算机视觉库使用的是RGB
通道格式。因此,当您将OpenCV与其他工具包一起使用时,当您从一个库切换到另一个库时,不要忘记交换蓝色和红色
通道。
如下面的代码部分所示,我们将首先使用上面描述的所有三个标志值读取测试图像。
# Read an image
img_color = cv2.imread('test.jpg',cv2.IMREAD_COLOR)
img_grayscale = cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE)
img_unchanged = cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)
// Read an image
Mat img_color = imread("test.jpg", IMREAD_COLOR);
Mat img_grayscale = imread("test.jpg", IMREAD_GRAYSCALE);
Mat img_unchanged = imread("test.jpg", IMREAD_UNCHANGED);
或者
img_color = cv2.imread('test.jpg',1)
img_grayscale = cv2.imread('test.jpg',0)
img_unchanged = cv2.imread('test.jpg',-1)
Mat img_color = imread("test.jpg", 1);
Mat img_grayscale = imread("test.jpg", 0);
Mat img_unchanged = imread("test.jpg", -1);
在OpenCV中,使用imshow()函数显示图像。这里的语法如下:
imshow(window_name, image)
他的函数也有两个参数:
一次显示多个图像,请为要显示的每个图像指定一个新窗口名称
imshow()
函数被设计成与waitKey()
和destroyAllWindows() / destroyWindow()
函数一起使用。
waitKey()
函数是一个键盘绑定函数。
0
,程序将无限期地等待按键。Q
键或ESC
键,从而更明确地告诉哪个键应该触发哪个行为。destroyAllWindows()
函数会销毁我们创建的所有窗口。如果一个特定的窗口需要被销毁,给出确切的窗口名作为参数。使用destroyAllWindows()
还可以从系统的主内存中清除窗口或映像。下面的代码示例展示了如何使用imshow()
函数来显示读取的图像。
#Displays image inside a window
cv2.imshow('color image',img_color)
cv2.imshow('grayscale image',img_grayscale)
cv2.imshow('unchanged image',img_unchanged)
# Waits for a keystroke
cv2.waitKey(0)
# Destroys all the windows created
cv2.destroyAllwindows()
// Create a window.
namedWindow( "color image", WINDOW_AUTOSIZE );
namedWindow( "grayscale image", WINDOW_AUTOSIZE );
namedWindow( "unchanged image", WINDOW_AUTOSIZE );
// Show the image inside it.
imshow( "color image", img_color );
imshow( "grayscale image", img_grayscale );
imshow( "unchanged image", img_unchanged );
// Wait for a keystroke.
waitKey(0);
// Destroys all the windows created
destroyAllWindows();
最后,让我们讨论如何使用imwrite()
函数将图像写入/保存到文件目录中。检查它的语法:
imwrite(filename, image).
cv2.imwrite('grayscale.jpg',img_grayscale)
imwrite("grayscale.jpg", img_grayscale);