不会吧?不会吧?不会吧?不会有人忘记我还会写图像处理的代码吧?别说了,我知道你忘了,没关系,我会在这篇文章写一些很简短的代码实现常见的图像处理工作(别问为啥写不长,能力有限,20行开外就不受控制了)。
import cv2
def extract_frames(video_path, interval):
# 打开视频文件
cap = cv2.VideoCapture(video_path)
# 计算视频总帧数和帧率
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = cap.get(cv2.CAP_PROP_FPS)
# 计算抽帧间隔
interval_frames = int(interval * fps)
# 初始化帧计数器和关键帧列表
count = 0
frames = []
# 逐帧遍历视频
while True:
frame = cap.read()
if not ret:
break
count += 1
# 如果是关键帧,将其添加到关键帧列表中
if count % interval_frames == 0:
frames.append(frame)
# 关闭视频文件
cap.release()
return frames
frames = extract_frames('video.mp4', 1) # 抽取间隔为1秒的关键帧
for frame in frames:
cv2.imshow('frame', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
def extract_depth_edges(depth_img):
# 计算Sobel算子的卷积核
sobelx = cv2.Sobel(depth_img, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(depth_img, cv2.CV_64F, 0, 1, ksize=3)
# 计算梯度幅值和方向
grad_mag = np.sqrt(sobelx ** 2 + sobely ** 2)
grad_dir = np.arctan2(sobely, sobelx)
# 将梯度幅值归一化到0-255之间
grad_mag_norm = cv2.normalize(grad_mag, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
# 将梯度方向转换为角度
grad_dir_deg = (grad_dir * 180 / np.pi) % 180
# 应用非极大值抑制
grad_mag_nms = cv2.Canny(grad_mag_norm, 100, 200)
return grad_mag_nms
depth_img = cv2.imread('depth_image.png', cv2.IMREAD_GRAYSCALE)
edges = extract_depth_edges(depth_img)
cv2.imshow('depth_edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np
# 假设我们已经提取了深度图像的边缘信息,存储在名为edge_img的NumPy数组中
# 将边缘值缩放到0到1之间
edge_img = edge_img / 255.0
# 将边缘信息转换为字符串格式
edge_str = np.array2string(edge_img, separator=',', formatter={'float_kind':lambda x: "%.5f" % x})
# 将字符串写入txt文件
with open('edge_info.txt', 'w') as f:
f.write(edge_str)
import cv2
import numpy as np
def extract_edge(frame, threshold):
# 使用高斯模糊平滑图像
blurred = cv2.GaussianBlur(frame, (3, 3), 0)
# 转换为灰度图像
gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
# 使用Canny算法提取边缘
edges = cv2.Canny(gray, threshold, threshold * 2)
return edges
def save_edges_to_txt(edges, filename):
# 将边缘值缩放到0到1之间
edges = edges / 255.0
# 将边缘信息转换为字符串格式
edge_str = np.array2string(edges, separator=',', formatter={'float_kind':lambda x: "%.5f" % x})
# 将字符串写入txt文件
with open(filename, 'w') as f:
f.write(edge_str)
# 读取深度图像
depth_img = cv2.imread('depth_img.png')
# 指定抽帧间隔
interval = 10
# 提取深度图像边缘
edges = extract_edge(depth_img, 50)
# 抽帧,保留每隔interval个像素
sampled_edges = edges[::interval, ::interval]
# 将边缘信息保存到txt文件中
save_edges_to_txt(sampled_edges, 'edge_info.txt')
import cv2
import numpy as np
def load_edges_from_txt(filename, shape):
# 从txt文件中读取边缘信息
edge_str = np.loadtxt(filename, delimiter=',')
# 创建全零数组
edges = np.zeros(shape)
# 将边缘信息复制到全零数组的对应位置上
np.put(edges, np.arange(shape[0]*shape[1]), edge_str)
# 对全零数组进行插值操作
edges = cv2.resize(edges, (shape[1], shape[0]))
# 对插值后的边缘图像进行二值化处理
ret, edges = cv2.threshold(edges, 0, 255, cv2.THRESH_BINARY)
return edges
# 读取深度图像
depth_img = cv2.imread('depth_img.png')
# 获取深度图像大小
height, width = depth_img.shape[:2]
# 从txt文件中加载边缘信息,并恢复成图像
edges = load_edges_from_txt('edge_info.txt', (height//10, width//10))
# 显示原始深度图像和恢复的边缘图像
cv2.imshow('depth_img', depth_img)
cv2.imshow('edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
# 读取原始图像
img = cv2.imread('original_image.png')
# 缩放图像
new_img = cv2.resize(img, (10, 10), interpolation=cv2.INTER_AREA)
# 显示原始图像和缩放后的图像
cv2.imshow('original', img)
cv2.imshow('new', new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()