结合机器视觉与深度学习的 Python 项目
以下是一个结合机器视觉与深度学习的 Python 项目示例,用于对茶汤照片进行背景处理、识别颜色最均匀的区域、进行色彩校正并提取 RGB 值,同时可以处理从采集装置传输到电脑的照片。
项目思路
- 背景处理:使用 OpenCV 库对图像进行预处理,如高斯模糊、边缘检测等,去除背景干扰。
- 识别颜色最均匀的区域:将图像分割成小区域,计算每个区域的颜色方差,选择方差最小的区域作为颜色最均匀的区域。
- 色彩校正:使用标准色卡或已知颜色的区域进行色彩校正。
- 提取 RGB 值:从颜色最均匀的区域中提取平均 RGB 值。
- 处理采集装置传输的照片:可以使用 Python 的文件操作功能,监听指定文件夹,当有新照片传入时自动处理。
代码实现
import cv2
import numpy as np
import os
import time
# 背景处理函数
def background_processing(image):
# 高斯模糊
blurred = cv2.GaussianBlur(image, (5, 5), 0)
# 转换为灰度图像
gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
# 边缘检测
edges = cv2.Canny(gray, 50, 150)
# 查找轮廓
contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 创建掩码
mask = np.zeros_like(gray)
cv2.drawContours(mask, contours, -1, 255, thickness=cv2.FILLED)
# 应用掩码
result = cv2.bitwise_and(image, image, mask=mask)
return result
# 识别颜色最均匀的区域
def find_most_uniform_region(image, grid_size=50):
height, width, _ = image.shape
min_variance = float('inf')
most_uniform_region = None
for y in range(0, height, grid_size):
for x in range(0, width, grid_size):
roi = image[y:y+grid_size, x:x+grid_size]
if roi.size > 0:
variance = np.var(roi, axis=(0, 1))
total_variance = np.sum(variance)
if total_variance < min_variance:
min_variance = total_variance
most_uniform_region = roi
return most_uniform_region
# 色彩校正(简单示例,假设已知标准颜色)
def color_correction(image, standard_color=(255, 255, 255)):
# 计算平均颜色
mean_color = np.mean(image, axis=(0, 1))
# 计算校正系数
correction_factors = np.divide(standard_color, mean_color)
# 应用校正系数
corrected_image = np.multiply(image, correction_factors).astype(np.uint8)
return corrected_image
# 提取 RGB 值
def extract_rgb_values(image):
mean_rgb = np.mean(image, axis=(0, 1)).astype(int)
return mean_rgb
# 处理照片的主函数
def process_image(image_path):
# 读取图像
image = cv2.imread(image_path)
if image is None:
print(f"无法读取图像: {image_path}")
return
# 背景处理
processed_image = background_processing(image)
# 识别颜色最均匀的区域
uniform_region = find_most_uniform_region(processed_image)
# 色彩校正
corrected_region = color_correction(uniform_region)
# 提取 RGB 值
rgb_values = extract_rgb_values(corrected_region)
print(f"提取的 RGB 值: {rgb_values}")
# 显示处理后的图像
cv2.imshow("Processed Image", processed_image)
cv2.imshow("Most Uniform Region", uniform_region)
cv2.imshow("Corrected Region", corrected_region)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 监听指定文件夹,处理新传入的照片
def monitor_folder(folder_path):
processed_files = set()
while True:
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.lower().endswith(('.png', '.jpg', '.jpeg')):
file_path = os.path.join(root, file)
if file_path not in processed_files:
print(f"处理新照片: {file_path}")
process_image(file_path)
processed_files.add(file_path)
time.sleep(1)
if __name__ == "__main__":
# 替换为实际的照片文件夹路径
folder_path = "path/to/your/photos"
monitor_folder(folder_path)
代码解释
- background_processing 函数:对图像进行高斯模糊、边缘检测和轮廓查找,创建掩码并应用到原始图像上,去除背景干扰。
- find_most_uniform_region 函数:将图像分割成小区域,计算每个区域的颜色方差,选择方差最小的区域作为颜色最均匀的区域。
- color_correction 函数:计算图像的平均颜色,与标准颜色进行比较,计算校正系数并应用到图像上。
- extract_rgb_values 函数:计算颜色最均匀区域的平均 RGB 值。
- process_image 函数:读取图像,依次调用背景处理、识别颜色最均匀的区域、色彩校正和提取 RGB 值的函数,并显示处理后的图像。
- monitor_folder 函数:监听指定文件夹,当有新照片传入时,调用 process_image 函数进行处理。
注意事项
- 请将
folder_path
替换为实际的照片文件夹路径。 - 色彩校正部分的标准颜色可以根据实际情况进行调整。
- 代码中的网格大小
grid_size
可以根据图像的实际情况进行调整。