02灰度转换
读取图片之后,首先需要将图片灰度化,代码如下,详解见注释。
在工程OpenCV中新建一个"02灰度转换.py"文件
import cv2 #导入opencv库
img=cv2.imread("./images/dehua.jpg") #读取图片文件dehua.jpg(文件名不能有中文),存入img
cv2.imshow("ReadImg",img) #显示图片img,第一个参数即Windows窗口标题栏的值,第二参数即要显示的图片(已读入)
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #将图片img,以cv2.COLOR_BGR2GRAY的颜色方式转换(BRG 至 GRAY)
cv2.imshow("gray_img1",gray_img) #显示图片gray_img
cv2.imwrite("gray1.jpg",gray_img) #将图片gray_img保存至文件gray.jpg,位置与02灰度转换.py同目录
cv2.waitKey(0) #等待,参数0即一直等待;参数1000即等待1秒
cv2.destroyAllWindows() #释放内存
其中cv2.COLOR_BGR2GRAY意为图片的颜色从BGR(蓝绿红) 转换至 GRAY(灰度)。
图片的颜色不都是RGB吗?怎么这里是BGR呢?事后查了一下,其实也有cv2.COLOR_RGB2GRAY的。
这两个有什么区别呢?
首先BGR2GRAY将原图按如下计算公式转换为灰度图,计算公式为Gray = 0.1140B + 0.5870G + 0.2989*R(其中B G R 就是某个像素点的蓝绿红值),若像素点的蓝绿红值为(157 183 220 ),则Gray=0.1140 * 157 + 0.5870 * 183 + 0.2989 * 220 ≈ 191
其次RGB2GRAY的计算公式为Gray = 0.1140R + 0.5870G + 0.2989*B,与BGR2GRAY相比,转换的系数一致,不同的是系数后紧跟的蓝绿红的顺序变化了,由BGB变为RGB。
还是前面的例子,则Gray=0.1140 * 220 + 0.5870 * 183 + 0.2989 * 157 ≈ 179
讲解就到这样,其他的就留给有兴趣同学自己探究了。
03修改尺寸
修改图片的尺寸比较简单,代码如下:
import cv2 #导入opencv库
img=cv2.imread("./images/dehua.jpg") #读取图片文件dehua.jpg(文件名不能有中文),存入img
resize_img=cv2.resize(img,dsize=(200,200)) #修改读入的图片img,大小改为200*200,存入resize_img
cv2.imshow("ReadImg",img) #显示图片img
cv2.imshow("ResizeImg",resize_img) #显示图片resize_img
print("未修改",img.shape) #输出img的尺寸+通道数(RGB)
print("修改后",resize_img.shape) #输出reszie_img的尺寸+通道数(RGB)
while True: #如果按下小写字母键"q",则结束循环
if cv2.waitKey() == ord("q"): #否则一直循环,即等待
break
cv2.destroyAllWindows() #释放内存
有三点需要说明:
第一、两句print,请大家观察输出的结果,留一个小问题可尝试自行探究,img.shape和resize_img.shape的数据类型是什么?
第二、留意While True循环,这个循环条件为始终为真,如何退出循环呢?答案即break;
第三、cv2.waitKey()若无参加,即等待从键盘上按下一个键,若按下的是小写"q",则需要判断是否和"q"的ASCII码ord(“q”)相等;若参数是0,即cv2.waitKey(0),则一直等待,直到从键盘上按下任意键;若参数是整数,即cv2.waitKey(1000),则等待1秒。