使用 Opencv,你不需要成为操作和处理图像的专家。图像处理是一个强大的工具;它有助于操纵、增强和提取图像中的细节。该技术用于从娱乐和游戏到取证的多个领域。例如,它可以用于识别嫌疑人、分析视觉证据、重建犯罪现场并支持调查过程。
Opencv是如何工作的?
每个图像都由像素矩阵组成。后者由称为 RGB 颜色的三种主要颜色表示,即红色、绿色和蓝色(我们可以从这三种颜色中精确地得出 256 * 256 * 256 = 16,777,216 种可能的颜色)。我们使用核矩阵对每个主颜色应用卷积运算。
什么是卷积矩阵滤波器?什么是核矩阵?
卷积操作是用另一个称为“核”的矩阵对一个矩阵进行处理。
卷积矩阵滤波器使用第一个矩阵,该矩阵是要处理的图像。图像是直角坐标系中像素的二维集合。使用的内核取决于你想要的效果。
让我们考虑一个具有 9 个像素的输入图像(保持简单,图像只有 9 个像素)。
为了获得最终的输出图像,我们将进行一些基本的数学计算。
实际上非常简单。我们将内核矩阵放在输入图像矩阵上,并将每个正方形中的各个条目相乘,然后将结果相加。
在这种情况下,它是:
(1 × 0) + (2 × 0) + (1×0) + (0×0) + (0×1) + (0×2) + (-1)×0 + (-2)×4 + (-1)×5 = -8 + (-5) = -13
我们将取总和为-13,并将输出图像中的中心像素设置为该颜色,具体位置在第一行和第二列(1,1)。
我们对位置 (1,2) 上的第二个像素执行相同的操作,我们得到:
(1 × 0) + (2 × 0) + (1×0) + (0×1) + (0×2) + (0×3) + (-1)×4 + (-2)×5 + (-1)×6 = -4 + (-10) + (-6) = -20
在扫描映射每个新数字的图像后,我们将获得输出图像中所示的值。
图像处理
这里的 Python 代码将处理所有卷积计算的麻烦。
import cv2
import numpy as np
# Load the image
image = cv2.imread('image.png')
# Define the kernel matrix for blurring
kernel_blur= np.array([[1/9, 1/9, 1/9],
[1/9, 1/9, 1/9],
[1/9, 1/9, 1/9]])
# Apply the emboss filter
Blurry_Image = cv2.filter2D(image, -1, kernel_blur)
# Display the original and processed images
cv2.imshow("Original Image", image)
cv2.imshow("Blurry Image", Blurry_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
让我们拍一张第一次尝试滑翔伞的孩子的照片!
一个孩子尝试滑翔伞的原始图像
执行代码后,内核模糊会产生模糊图像。
让我们改变代码中的矩阵,以便我们可以检测图像中的边缘:
Edge_detection_Matrix= np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
我们得到以下结果:
尝试滑翔伞的孩子图像的边缘检测
现在,让我们使用浮雕矩阵做一些有趣的事情,它在图像上创建 3D 效果:
Emboss_Matrix = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]])
孩子尝试滑翔伞的 3D 图像
你也可以尝试以下一些其他矩阵:
identity_scaled_matrix = np.array([[0.5, 0, 0],
[0, 2, 0],
[0, 0, 1]])
该缩放单位矩阵可用于调整图像的亮度或对比度。
sobel_x_matrix = np.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]])
sobel_y_matrix = np.array([[-1, -2, -1],
[0, 0, 0],
[1, 2, 1]])
Sobel 矩阵用于边缘检测。sobel_x_matrix
检测垂直边缘,同时,sobel_y_matrix
检测水平边缘。
视频处理
我们也可以操作视频,因为视频或 GIF 只不过是一组帧。
import cv2
import numpy as np
# Open the video file
video = cv2.VideoCapture('video.mp4')
# Get the video's frame width and height
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
# Create a video writer object
output_file = 'output.mp4'
video_writer = cv2.VideoWriter(output_file, cv2.VideoWriter_fourcc(*'mp4v'), 30, (width, height))
# Loop through each frame of the video
while True:
# Read the current frame
ret, frame = video.read()
# If the frame was not successfully read, end the loop
if not ret:
break
Edge_detection_Matrix = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
# Apply the filter to the current frame
result = cv2.filter2D(frame, -1, Emboss_Matrix)
# Write the frame to the video file
video_writer.write(result)
# Show the current frame
cv2.imshow("Result", result)
# Wait for key press
if cv2.waitKey(1) == ord('q'):
break
# Release the video reader and writer, and close all windows
video.release()
video_writer.release()
cv2.destroyAllWindows()
# Save the result video to a specific file path
output_path = 'path/to/save/output.mp4'
cv2.imwrite(output_path, result)
我们以下面的 GIF 为例:
2D 动画
通过应用边缘检测操纵矩阵,我们得到:
检测到 2D 动画的边缘
结论
我们已经了解了如何使用 OpenCV 应用各种滤镜和变换,例如模糊、锐化和浮雕,这使我们能够修改图像的外观以实现所需的视觉效果。开发人员和研究人员可以高效地处理图像读取、显示、过滤、转换和分析等图像操作。
作者:磐怼怼
来源:深度学习与计算机视觉
原文:https://mp.weixin.qq.com/s/2DdSvDAg5roSF_n3-K15ww
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。