程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

图像处理案例分享:图像检索(以图搜图)、缺陷检测、手势识别

balukai 2025-01-01 17:56:53 文章精选 10 ℃

今天继续我们的图像处理案例分享(当然,这需要一定的python基础):

1. 图像检索(以图搜图)

以图搜图是计算机视觉中的一个重要应用,它可以在图像数据库中找到与给定查询图像相似的图像。以下是一个简单的以图搜图示例代码:

import cv2
import numpy as np

# 感知哈希算法计算函数
def perceptual_hash(image):
    # 调整图像大小为8x8
    image = cv2.resize(image, (8, 8), interpolation=cv2.INTER_AREA)
    # 转换为灰度图像
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 计算平均灰度值
    mean_value = np.mean(gray_image)
    # 根据平均灰度值生成哈希值
    hash_value = ''
    for i in range(gray_image.shape[0]):
        for j in range(gray_image.shape[1]):
            if gray_image[i][j] > mean_value:
                hash_value += '1'
            else:
                hash_value += '0'
    return hash_value

# 计算两个哈希值之间的汉明距离
def hamming_distance(hash1, hash2):
    return sum(c1!= c2 for c1, c2 in zip(hash1, hash2))

# 读取查询图像
query_image = cv2.imread('query.jpg')
query_hash = perceptual_hash(query_image)

# 读取图像数据库中的所有图像
image_database = []
for i in range(1, 11):  # 假设数据库中有10张图像,命名为image1.jpg - image10.jpg
    image_path = f'image{i}.jpg'
    image = cv2.imread(image_path)
    image_hash = perceptual_hash(image)
    image_database.append((image_path, image_hash))

# 在数据库中查找相似图像
similar_images = []
for image_path, image_hash in image_database:
    distance = hamming_distance(query_hash, image_hash)
    if distance < 10:  # 设定汉明距离阈值为10,可根据实际情况调整
        similar_images.append(image_path)

print("相似图像:", similar_images)

2. 缺陷检测

工业产品的形状缺陷不仅影响产品的美观,还影响产品的性能。以下是一个使用轮廓检测的方式来实现缺陷检测的示例代码:

import cv2
import numpy as np

# 读取原始图像
img = cv2.imread('product.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 查找所有轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 筛选出可能的缺陷轮廓(这里简单地以面积小于某个阈值为例)
defect_contours = []
for contour in contours:
    area = cv2.contourArea(contour)
    if area < 100:  # 设定面积阈值为100,可根据实际情况调整
        defect_contours.append(contour)

# 在原始图像上绘制缺陷轮廓
for defect_contour in defect_contours:
    cv2.drawContours(img, [defect_contour], -1, (0, 0, 255), 2)

cv2.imshow('Defect Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 手势识别

手势识别在人机交互等领域有着重要的应用。以下是一个简单的手势识别示例代码,识别手势表示的数值(0 - 5):

import cv2
import numpy as np

# 读取手势图像
gesture_image = cv2.imread('gesture.jpg')
gray = cv2.cvtColor(gesture_image, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 查找所有轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 找到最大的轮廓作为手势轮廓
gesture_contour = max(contours, key=cv2.contourArea)

# 获取手势轮廓的凸包
hull = cv2.convexHull(gesture_contour)

# 获取凸包与轮廓之间的凸缺陷
convexity_defects = cv2.convexityDefects(gesture_contour, hull)

# 计算凸缺陷的个数
defect_count = 0
for i in range(convexity_defects.shape[0]):
    start, end, far, _ = convexity_defects[i][0]
    if far > 20:  # 忽略一些距离较近的小凸缺陷
        defect_count += 1

# 根据凸缺陷个数识别手势表示的数值
if defect_count == 0:
    gesture_value = 0 if cv2.contourArea(gesture_contour) / cv2.contourArea(hull) > 0.9 else 1
elif defect_count == 1:
    gesture_value = 2
elif defect_count == 2:
    gesture_value = 3
elif defect_count == 3:
    gesture_value = 4
else:
    gesture_value = 5

print("手势表示的数值:", gesture_value)
最近发表
标签列表