图像基本处理
总体描述
给定图像,实现图像的代数运算(+、-)、逻辑运算(与或非)以及几何运算(平移、旋转、对称、缩放等)
要求
要求 1:学会运用图像代数运算实现图像二次曝光效果以及前景目标提取
要求 2:应用逻辑运算进行模板提取
要求 3:应用几何运算实现图像数据增强
考核点:应用代数运算、逻辑运算、几何运算,结合实际问题设计并实现技术方案
代码
import cv2
import numpy as np
img1=cv2.imread('H:/CV/1(1).jpg')
img2=cv2.imread('H:/CV/2(1).jpg')
#二次曝光
add_img=cv2.addWeighted(img1,0.7,img2,0.3,0)
# 显示结果
cv2.namedWindow('add_img',cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow('add_img',400,600)
cv2.imshow('add_img',add_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#前景目标提取
grayscale_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
# 应用阈值分割(将灰度图像转换为二值图像)
ret, binary_img = cv2.threshold(grayscale_img1, 127, 255, cv2.THRESH_BINARY)
# 显示结果
cv2.namedWindow('result',cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow('result',400,600)
cv2.imshow('result', binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 应用阈值分割将模板图像转换为二值图像,并获取掩膜图像
dst, mask = cv2.threshold(img2_gray, 127, 255, cv2.THRESH_BINARY)
# 应用掩膜对原图像进行位运算并显示结果
result = cv2.bitwise_and(img1_gray, mask)
# 显示结果
cv2.namedWindow('result',cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow('result',400,600)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
# bitwise_and()函数用于应用掩膜对原图像进行位运算。
# 通过修改阈值、调整掩膜等参数可以得到不同的模板提取效果。
# 平移变换(向右平移50个像素,向下平移100个像素)
rows, cols = img1.shape[:2]
M = np.float32([[1, 0, 50], [0, 1, 100]])
shifted_img = cv2.warpAffine(img1, M, (cols, rows))
# 显示结果
cv2.namedWindow('shifted image',cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow('shifted image',400,600)
cv2.imshow('shifted image', shifted_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 旋转变换(逆时针旋转30度)
M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)
rotated_img = cv2.warpAffine(img1, M, (cols, rows))
# warpAffine()函数用于进行平移和旋转变换
# 显示结果
cv2.namedWindow('rotated image',cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow('rotated image',400,600)
cv2.imshow('rotated image', rotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 缩放变换(缩小一倍)
scaled_img = cv2.resize(img1, None, fx=0.5, fy=0.5)
# resize()函数用于进行缩放变换
# 显示结果
cv2.namedWindow('scaled image',cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow('scaled image',400,600)
cv2.imshow('scaled image', scaled_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 翻转变换(水平翻转)
flipped_img = cv2.flip(img1, 1)
# flip()函数用于进行翻转变换
# 显示结果
cv2.namedWindow('flipped image',cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow('flipped image',400,600)
cv2.imshow('flipped image', flipped_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像滤波
总体描述
在空域与频域图像处理中,滤波操作是图像预处理子系统的常用技术手段,请针对无人驾驶视觉系统中采集图像可能存在的各种因素影响,设计并实现图像预处理子系统。
要求
要求 1:不同天气条件下的图像增强
要求 2:不同光照条件下的图像增强
要求 3:分析不同卷积核对结果的影响
考核点:设计与实现预处理子系统,并根据实际结果分析对比,进行方案优选,确定并实现最终子系统
代码
import cv2
import numpy as np
# 读取原始图像
img = cv2.imread('H:/CV/test_image.jpg')
# 显示结果
cv2.namedWindow('original image',cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow('original image',400,600)
cv2.imshow('original image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 不同天气条件下的图像增强
# GaussianBlur():高斯模糊滤波器,可用于去噪。
blur_img = cv2.GaussianBlur(img, (5, 5), 0)
# 提高对比度和亮度
alpha = 1.5 # 对比度调整参数(1.0为原始值)
beta = 50 # 亮度调整参数(0为原始值)
# convertScaleAbs():对图像进行线性变换以提高对比度和亮度。
enhanced_img = cv2.convertScaleAbs(blur_img, alpha=alpha, beta=beta)
# 显示结果
cv2.namedWindow('enhanced image',cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow('enhanced image',400,600)
cv2.imshow('enhanced image', enhanced_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 不同光照条件下的图像增强
# 直方图均衡化提高对比度
# cvtColor():将彩色图像转换为灰度图像。
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# equalizeHist():直方图均衡化操作,可用于提高对比度。
equalized_img = cv2.equalizeHist(gray_img)
# 显示结果
cv2.namedWindow('equalized image',cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow('equalized image',400,600)
cv2.imshow('equalized image', equalized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 分析不同卷积核对结果的影响
kernel_sizes = [3, 5, 7]
for size in kernel_sizes:
# 定义卷积核并应用滤波操作(平均模糊)
kernel = np.ones((size, size), np.float32) / (size * size)
# filter2D():通用卷积函数,可应用不同大小的卷积核进行平均模糊等操作。
filtered_img = cv2.filter2D(img, -1, kernel)
cv2.namedWindow('filtered image',cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow('filtered image',400,600)
cv2.imshow('filtered image', filtered_img)
cv2.waitKey(0)
cv2.destroyAllWindows()