import cv2
import numpy as np读取并显示图像
#图像本质是一个矩阵,在opencv for Python中,图像就是numpy.arrayimg = cv2.imread("ustcred.jpg")#OpenCV目前支持读取bmp、jpg、png、tiff等常用格式
#路径中若用反斜杠,起始处最好用双斜杠。反斜杠可能会被当作转义字符。D:\\cat.jpg
#imread()默认以BGR模式读取图片,即使图片使用灰度格式,BGR表示与RGB相同的燕娥空间,只是字节顺序相反。opencv使用BGR是历史遗留问题。
#imread有第二个可选参数,指定图像读入模式:CV_LOAD_IMAGE_COLOR(BGR)、CV_LOAD_IMAGE_GRAYSCALE(灰度)或CV_LOAD_IMAGE_UNCHANGED(BGR)
#这里需要特别注意的是,opencv使用的BGR模式,如果使用其他读入方式读取图像,如读入了RGB格式再使用opencv相关函数就会出错
#无论模式如何,imread取()都会丢弃任何alpha通道(透明度)。imwrite()函数要求图像为BGR或灰度格式,其每个同都都通道可以支持输出格式的一些比特位。例如,bmp需要每通道8位,而PNG允许每通道8位或16位。cv2.namedWindow("Image") #创建窗口
cv2.imshow("Image", img) #在窗口中显示图像
cv2.waitKey(0) #如果不添最后一句,在IDLE中执行窗口直接无响应。在命令行中执行的话,则是一闪而过#如果添加这一句,则该语句前的所有imshow函数都被执行,只有将弹出的所有图像窗口关闭,后续的窗口才会打开
opencv中图像的几个属性print(img.ndim)
print(img[0,0])
print(img.shape)
grayimg=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(grayimg.ndim)
print(grayimg[0,0])
print(grayimg.shape)3
[255 255 255]
(656, 645, 3)
2
255
(656, 645)
这里有一个重要的疑问:为什么python中灰度图的通道是二通道,难道0-255不能表示灰度图吗?
创建/复制图像
#在opencv for Python中,图像就是numpy中的数组,因而img对象自带shape属性(长、宽、通道信息),eg:(656, 645, 3),3表示这是一个rgb图像
#创建同尺寸的空图像emptyImage = np.zeros(img.shape, np.uint8)#调用copy方法复制图像emptyImage2 = img.copy();#使用cvtColor获得原图副本emptyImage3=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #第二个参数cv2.COLOR_BGR2GRAY表示获得原图的二值化图像
#emptyImage3[...]=0 ,该语句可以将图像转成空白的黑色图像
cv2.imshow("emptyImage2", emptyImage2) #在窗口中显示图像
cv2.imshow("emptyImage3", emptyImage3) #在窗口中显示图像
cv2.waitKey(0)#如果没有该语句,上面两个图像窗口无响应或一闪而过保存图像
#直接使用imwrite方法cv2.imwrite("D:\Project\PythonProject\opencv_practice\redustccopy.jpg", img) #注意,在unicode编码中\常被当作转义字符,此处\redustccopy就应该写成\\redustccopy
#cv2.imwrite("D:\\cat2.jpg", img,[int(cv2.IMWRITE_JPEG_QUALITY), 5]) #第三个参数是可选参数。 对于JPEG,其表示的是图像的质量,用0-100的整数表示,默认为95。 注意,cv2.IMWRITE_JPEG_QUALITY类型为Long,必须转换成int。
#对于PNG,第三个参数表示的是压缩级别。cv2.IMWRITE_PNG_COMPRESSION,从0到9,压缩级别越高,图像尺寸越小。默认级别为3:
#cv2.imwrite("./cat.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
cv2.imwrite("./ustcred2.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
cv2.destroyAllWindows() #程序结束后释放所有窗口是个好习惯
















