首次完成时间:2024 年 9 月 20 日

使用OpenCV读取图像

一.实验内容

1. 采用不同的flag读取图片,查看各自的形状、尺寸和数据类型

1)程序代码:
import cv2
# 默认方法(BGR)
default = cv2.imread('cat.jpg')
print("default", default.shape, default.size, default.dtype)
# 三通道方式(BGR)
bgrim = cv2.imread('cat.jpg', cv2.IMREAD_COLOR)
print("bgrim", bgrim.shape, bgrim.size, bgrim.dtype)
# 原通道深度方式
unchange = cv2.imread('cat.jpg', cv2.IMREAD_UNCHANGED)
print("unchange", unchange.shape, unchange.size, unchange.dtype)
# 灰度图方式
grayim = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)
print("grayim", grayim.shape, grayim.size, "grayim.dtype", grayim.dtype)
2)代码分析:

2. 创建一个窗口“win”,在该窗口中默认显示“cat.jpg”.持续监听键盘,如果监听到空格键(key==32),则显示图像在cat.jpg 和 little.png 之间切换。如果监听到ESC(key==27),则销毁窗口。

1)程序代码:
import cv2

cat = cv2.imread('cat.jpg', cv2.IMREAD_COLOR)
R = cv2.imread('R.jpg', cv2.IMREAD_COLOR)
cv2.namedWindow("win")
cv2.imshow("win", cat)
flag = 0
while True:
    key = cv2.waitKey(0)
    if key == 32:
        if flag == 0:
            cv2.imshow("win",R)
            flag = 1
        elif flag == 1:
            cv2.imshow("win", cat)
            flag = 0
    if key == 27:
        cv2.destroyAllWindows()
        break
2)代码分析:

3. 实现图像处理的基本操作,读取图像cat.png并显示,等待按键后执行窗口销毁,并打印出图像数据,最后将图像另存为cat1.jpg。

1)程序代码:
import cv2
im = cv2.imread('cat.jpg')
cv2.namedWindow("cat")
cv2.imshow("cat", im)
cv2.waitKey()
cv2.destroyWindow("cat")
print(im)
cv2.imwrite("cat1.jpg", im)

2)代码分析:

4. 以默认方式读取图片cat.png,将图像转为灰度图和RGB模式并显示,比较原始图像与转换后图像的区别。

1)程序代码:
import cv2
im = cv2.imread('cat.jpg')
rgb = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow("BGR", im)
cv2.imshow("RGB", rgb)
cv2.imshow("GRAY", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

2)代码分析:

5. 以灰度图的方式读取图片cat.png,将灰度图转为二值图并显示,比较灰度图与二值图的区别。

1)程序代码:
import cv2
import numpy as np
# 灰度图方式读入图像
im = cv2.imread('cat_01.png', cv2.IMREAD_GRAYSCALE)
# 将灰度图转换成二值图设置
retval, dst = cv2.threshold(im, 100, 255, 0)
# 组合函数将原始图像和二值图组合在一个窗口中
imghstack = np.hstack((im, dst))
# 新建一个窗口用于显示图像
cv2.namedWindow("GRAY-Binary", 1)
cv2.imshow("GRAY-Binary", imghstack)
cv2.waitKey(0)
2)代码分析:

6. 将BGR图像cat.jpg进行通道拆分,再将通过顺序变化后合并成新图像。

1)程序代码:
import cv2
import numpy as np

im = cv2.imread('cat 269_314.png')  # 读取图像
b, g, r = cv2.split(im)   # 通道拆分
print(b)  # 参看 b 通道的图像数据
channelhstack = np.hstack((b, g, r))
cv2.imshow("BLUE-GREEN-RED", channelhstack)
newim1 = cv2.merge([r, g, b])
newim2 = cv2.merge([g, r, b])
imghstack = np.hstack((im, newim1, newim2))
cv2.imshow("OLD-NEW1-NEW2", imghstack)
cv2.waitKey(0)

2)代码分析:

、

7. 使用Opencv读取图像,对图像对每个像素进行数值运算,并使用opencv显示运算结果。

1)程序代码:
import cv2
import numpy as np
cat = cv2.imread('cat 269_314.png')
cat1 = cat//2
cat2 = cat+50
cv2.imshow("result", np.hstack((cat, cat1, cat2)))
cv2.waitKey(0)
cv2.destroyAllWindows()
2)代码分析:

8. 使用OpenCV实现多图交叉通道合并,查看合并效果。

1)程序代码:
import cv2

# 读取并调整 cat.jpg 图像大小
cat = cv2.imread("cat.jpg")
cat = cv2.resize(cat, (960, 540))
# 读取并调整 R.jpg 图像大小
R = cv2.imread("R.jpg")
R = cv2.resize(R, (960, 540))
# 确保两个图像尺寸相同
cat = cv2.resize(cat, (R.shape[1], R.shape[0]))
# 拆分 cat 和 R 图像的通道
b, g, r = cv2.split(cat)
b1, g1, r1 = cv2.split(R)
# 合并通道,确保使用来自同一图像的通道或者尺寸相同的通道
rs = cv2.merge([b, g1, r])  # 使用 R 的所有通道
# 显示结果
cv2.imshow("result", rs)
cv2.waitKey(0)
cv2.destroyAllWindows()

2)代码分析:

9. 使用OpenCV实现色相编辑。

1)程序代码:

import numpy as np
import cv2
im = cv2.imread('cat 269_314.png')
im = cv2.resize(im, (269, 314))
hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)  # 色彩分离
h = h + 50  # 色相编辑
rs = cv2.merge((h, s, v))
rs = cv2.cvtColor(rs, cv2.COLOR_HSV2BGR)
cv2.imshow('result', np.hstack((im, rs)))
cv2.waitKey(0)
cv2.destroyAllWindows()

2)代码分析:

更多推荐