python实现图像加载与保存,窗口创建与销毁,图片常用属性,ROI,通道的分离与合并,对比度和亮度
目录:
(一)图像加载与保存
(二)图像显示窗口创建与销毁
(三)图片的常用属性的获取
(四)生成指定大小的矩形区域(ROI)
(五)图片颜色通道的分离与合并
(六)两张图片相加,改变对比度和亮度
(一)图像加载与保存
1 cv2.imread(filename, flags) :读取加载图片 2 3 cv2.imshow(winname, mat) : 显示图片 4 5 cv2.waitKey() : 等待图片的关闭,可设置参数,为多少毫秒后自动关闭,0时等待用户输入自动关闭。 6 7 cv2.imwrite(filename, img) : 保存图片,filename 要存在否则报错
1 import cv2 2 3 4 # 读取图片,第二个参数为False时,显示为灰度图像,True为原图 5 img = cv2.imread(filename="cat.jpg", flags=False) 6 7 # 显示图片,第一个参数为图片的标题 8 cv2.imshow(winname="image title", mat=img) 9 10 # 等待图片的关闭,不写这句图片会一闪而过 11 cv2.waitKey() 12 13 # 保存图片 14 cv2.imwrite("Grey_img.jpg", img
(二)图像显示窗口创建与销毁
1 cv2.namedWindow(winname, 属性):创建一个窗口 2 cv2.destroyWindow(winname):销毁某个窗口 3 cv2.destroyAllWindows():销毁所有窗口 4 5 winname作为窗口的唯一标识,如果想使用指定窗口显示目标图像,需要让cv2.imshow(winname)中的winname与窗口的winname需要保持一致。 6 7 窗口创建时可以添加的属性: 8 9 cv2.WINDOW_NORMAL:窗口大小可以改变(同cv2.WINDOW_GUI_NORMAL) 10 cv2.WINDOW_AUTOSIZE:窗口大小不能改变 11 cv2.WINDOW_FREERATIO:窗口大小自适应比例 12 cv2.WINDOW_KEEPRATIO:窗口大小保持比例 13 cv2.WINDOW_GUI_EXPANDED:显示色彩变成暗色 14 cv2.WINDOW_FULLSCREEN:全屏显示 15 16 cv2.WINDOW_OPENGL:支持OpenGL的窗口
1 img = cv2.imread("cat.jpg") 2 3 # 第二个参数为窗口属性 4 cv2.namedWindow(winname="title", cv2.WINDOW_NORMAL) 5 6 # 如果图片显示想使用上面的窗口,必须保证winname一致 7 cv2.imshow(winname="title", img) 8 9 cv2.waitKey() 10 11 # 销毁 12 cv2.destroyWindow("title") 13 # 销毁所有窗口:cv2.destroyAllWindows()
(三)图片的常用属性的获取
1 img.shape:打印图片的高、宽和通道数(当图片为灰度图像时,颜色通道数为1,不显示) 2 3 img.size:打印图片的像素数目 4 5 img.dtype:打印图片的格式 6 7 注意:这几个是图片的属性,并不是调用的函数,所以后面没有‘ () ’。
1 mport cv2 2 3 img = cv2.imread("cat.jpg") 4 imgGrey = cv2.imread("cat.jpg", False) 5 6 print(img.shape) 7 print(imgGrey.shape) 8 9 #输出: 10 #(280, 300, 3) 11 #(280, 300) 12 13 print(img.size) 14 print(img.dtype) 15 16 #输出: 17 # 252000 18 # uint8
(四)生成指定大小的矩形区域(ROI)
- 一个图片img,它的某个像素点可以用 img[x, y, c] 表示(x,y为坐标,c为通道数)
- 同理,这个图片的某个矩形区域可以表示为:img[x1:x2, y1:y2, c](相当于截下一块矩形,左上角坐标为(x1, y1),右下角坐标为(x2, y2))
- 其中 c 一般取值为0,1,2(BGR)代表第几个颜色通道,可以省略不写 img[x, y] 代表所有通道。
A.生成一个大小为(300,400)颜色通道数为3的红色图片
1 import cv2 2 import numpy as np 3 4 imgzero = np.zeros(shape=(300, 400, 3), dtype=np.uint8) 5 6 imgzero[:,:,:] = (0, 0, 255) # (B, G, R) 7 cv2.imshow("imgzero",imgzero) 8 cv2.waitKey()
B.从一张图片上截取一个矩形区域
1 import cv2 2 import numpy as np 3 4 img = cv2.imread("cat.jpg") 5 # 输出(50,100)上的像素值 6 num = img[50, 100] # 输出一数组。显示每个通道的像素值 7 print(num) 8 9 # 截取部分区域并显示 10 region = img[50:100, 50:100] 11 cv2.imshow("img", region) 12 cv2.waitKey()
# img[45,45,0] (45,45)在0通道的像素值
(五)图片颜色通道的分离与合并
-
cv2.split(m):将图片m分离为三个颜色通道
-
cv2.merge(mv):将三个颜色通道合并为一张图片
1 import cv2 2 3 img = cv2.imread("cat.jpg") 4 5 b, g, r = cv2.split(img) # b, g, r是可以显示的图片
6 7 merge = cv2.merge([b, g, r])
(六)两张图片相加,改变对比度和亮度
1 cv2.add(src1, src2):普通相加,尺度要一样 2 3 dst = cv2.addWeighted(src1, w1, src2, w2,beta):带权相加 4 src1:第一张图片 5 w1:第一张图片权重 6 src2:第二张图片 7 w2:第二张图片权重 8 beta:图1与图2作和后添加的数值。 9 dst:输出图片
1 import cv2 2 3 img1 = cv2.imread("cat.jpg") 4 img2 = cv2.imread("dog.jpg") 5 6 add1 = cv2.add(img1,img2) 7 8 add2 = cv2.addWeighted(img1, 0.5, img2, 0.5, 3) 9 10 cv2.imshow("add1", add1) 11 cv2.imshow("add2", add2) 12 cv2.waitKey()
cv2.addWeighted(src1, alpha, src2, w2,beta)可以改变图像的对比度和亮度。
通过改变alpha的值改变对比度,beta控制亮度。
1 # 改变对比度和亮度 2 def contrast_brightness_demo(img, c, b): 3 h, w, ch = img.shape 4 blank = np.zeros([h, w, ch], img.dtype) 5 dst = cv2.addWeighted(img, c, blank, 1-c , b) 6 cv2.imshow("contrast_brightness_demo", dst)
补充:
zeros 和ones 的用法补充 ,https://blog.csdn.net/u011321546/article/details/79523115