DIP_Get Ready
实验准备
使用CV读取和显示图像
import cv2 as cv
img = cv.imread("D:\\DIP_PHOTO\\Jiangyiyi.jpg")
cv.imshow("Demo", img)
cv.waitKey(0)
cv.destroyAllWindows()
使用Pyplot显示
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread("D:\\DIP_PHOTO\\Jiangyiyi.jpg", 0)
plt.imshow(img, 'gray')
plt.title('Jiangyiyi')
plt.show()
cv.waitKey(0)
cv.destroyAllWindows()
简单键盘响应和写入
import cv2 as cv
img = cv.imread("D:\\DIP_PHOTO\\Jiangyiyi.jpg", 1)
cv.imshow("Demo", img)
k = cv.waitKey(0)
if k == 27: # 按 Esc 退出
cv.destroyAllWindows()
elif k == ord('s'): # 按 's' 保存并退出
cv.imwrite("Jiangyiyi.tif", img)
cv.destroyAllWindows()
创建空图像并复制
import numpy as np
import cv2 as cv
img = cv.imread("D:\\DIP_PHOTO\\Jiangyiyi.jpg")
emptyImage1 = np.zeros(img.shape, np.uint8) # 创建空图像
emptyImage2 = img.copy() # 复制图像
cv.imshow("Demo1", img)
cv.imshow("Demo2", emptyImage1)
cv.imshow("Demo3", emptyImage2)
cv.waitKey(0)
cv.destroyAllWindows()
保存为不同格式
import cv2 as cv
# 关于图像写入
# retval = imwrite(filename, img[, params])
# – filename表示要保存的路径及文件名
# – img表示图像矩阵
# – params表示特定格式保存的参数编码,默认值为空。
# – 对于JPEG图片,params参数(cv2.IMWRITE_JPEG_QUALITY)表示图像的质量,用0-100的整数表示,默认值为95。
# – 对于PNG图片,该参数(cv2.IMWRITE_PNG_COMPRESSION)表示的是压缩级别,从0到9,压缩级别越高,图像尺寸越小,默认级别为3。
# – 对于PPM、PGM、PBM图片,该参数表示一个二进制格式的标志(cv2.IMWRITE_PXM_BINARY)。注意,该类型为Long,必须转换成int。
img = cv.imread("D:\\DIP_PHOTO\\Jiangyiyi.jpg")
cv.imshow("Demo", img)
cv.imwrite("dst1.jpg", img, [int(cv.IMWRITE_JPEG_QUALITY), 5])
cv.imwrite("dst2.jpg", img, [int(cv.IMWRITE_JPEG_QUALITY), 100])
cv.imwrite("dst3.png", img, [int(cv.IMWRITE_PNG_COMPRESSION), 0])
cv.imwrite("dst4.png", img, [int(cv.IMWRITE_PNG_COMPRESSION), 9])
cv.waitKey(0)
cv.destroyAllWindows()
改变图像尺寸并输出属性
import cv2 as cv
img = cv.imread("D:\\DIP_PHOTO\\Jiangyiyi.jpg")
img = cv.resize(img, (256, 256))
cv.imshow("Demo", img)
print(img.shape) # 获取图像形状
print(img.size) # 获取像素数目
print(img.dtype) # 获取图像数据类型
cv.waitKey(0)
cv.destroyAllWindows()
改变1个像素值
import cv2 as cv
img = cv.imread("D:\\DIP_Photo\\Lenna_RGB.tif", cv.IMREAD_UNCHANGED)
Pixel_x = 100
Pixel_y = 100
img[Pixel_x, Pixel_y] = [255, 255, 255]
# 分别获取BGR通道像素
blue = img[Pixel_x, Pixel_y, 0]
print(blue)
green = img[Pixel_x, Pixel_y, 1]
print(green)
red = img[Pixel_x, Pixel_y, 2]
print(red)
cv.imshow("Demo", img)
cv.waitKey(0)
cv.destroyAllWindows()
图像逻辑操作
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 方形图
rectangle = np.zeros((400, 400), dtype='uint8')
cv2.rectangle(rectangle, (50, 50), (350, 350), 255, -1)
# 圆形图
circle = np.zeros((400, 400), dtype='uint8')
cv2.circle(circle, (200, 200), 180, 255, -1)
# 图像逻辑运算
bitwiseAnd = cv2.bitwise_and(rectangle, circle)
bitwiseOr = cv2.bitwise_or(rectangle, circle)
bitwiseXor = cv2.bitwise_xor(rectangle, circle)
bitwiseNot = cv2.bitwise_not(rectangle)
titles = ['方形图', '圆形图', 'And', 'Or', 'Xor', 'Not']
images = [rectangle, circle, bitwiseAnd, bitwiseOr, bitwiseXor, bitwiseNot]
for i in range(6):
plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i], fontsize=12)
plt.xticks([]), plt.yticks([])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
打开默认摄像头
import cv2 as cv
cap = cv.VideoCapture(0)
while True:
success, img = cap.read()
cv.imshow('Video', img)
if cv.waitKey(1) & 0xFF == ord('q'):
break
cv.destroyAllWindows()
图像尺寸变化与截取
import cv2 as cv
img = cv.imread("D:\\DIP_Photo\\Lenna_RGB.tif")
print(img.shape)
imgResize = cv.resize(img, (640, 640))
print(imgResize.shape)
imgCropped = img[64:448, 64:448]
print(imgCropped)
cv.imshow("Lenna", img)
cv.imshow("Lenna_Resize", imgResize)
cv.imshow("Lenna_Cropped", imgCropped)
cv.waitKey()
cv.destroyAllWindows()
OpenCV简单绘图
import cv2 as cv
import numpy as np
img = np.zeros((256, 256, 3), np.uint8)
for i in range(32, 236, 12):
cv.line(img, (32, i), (224, i), (0, 255, 0), 1)
cv.line(img, (i, 32), (i, 224), (0, 0, 255), 1)
cv.imshow("Grid Image", img)
for i in range(0, 256, 1):
cv.line(img, (0, i), (256, i), (i, 0, 0), 1)
for i in range(20, 100, 20):
cv.circle(img, (127, 127), i, (255, 255, 255), 3)
cv.imshow("Blue Image", img)
print(img.shape)
cv.waitKey()
cv.destroyAllWindows()
再次修改1个像素点
import cv2 as cv
import numpy as np
img = np.zeros((8, 8), dtype=np.uint8)
print("img=\n", img)
cv.imshow("one", img)
print("读取像素点[3,3]=", img[3, 3])
img[3, 3] = 127
print("修改后的像素点[3,3]=", img[3, 3])
cv.imshow("two", img)
print("img=\n", img)
cv.waitKey(0)
cv.destroyAllWindows()
修改区域像素点
import cv2 as cv
img = cv.imread("D:\\DIP_Photo\\Lenna_RGB.tif")
cv.imshow("Before", img)
for i in range(10, 20):
for j in range(10, 500):
img[i, j] = 255, 255, 255
for i in range(490, 500):
for j in range(10, 500):
img[i, j] = 255, 255, 255
cv.imshow("After", img)
cv.waitKey()
cv.destroyAllWindows()
结束