网站首页 > 文章精选 正文
今天继续我们的图像处理案例分享(当然,这需要一定的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)
猜你喜欢
- 2025-01-01 前端智能化实践:从图片识别UI样式
- 2025-01-01 OpenCV 和 Python 识别数字的结果是怎样的呢
- 2025-01-01 HALCON_极坐标变换
- 2025-01-01 python使用fitz和opencv库提取pdf中的表格
- 2025-01-01 Fluent 多孔介质仿真(Porous Media)
- 2025-01-01 基于密度(Density-based)的聚类——核密度估计(KDE)
- 2025-01-01 机器视觉halcon学习系列---XLD的介绍和使用
- 2025-01-01 平学(26):Matlab学习之三维曲面图与常见函数(2)
- 2025-01-01 [OpenCV实战]13 OpenCV中使用Mask R-CNN进行对象检测和实例分割
- 2025-01-01 OpenCV使用分水岭算法实现图像分割
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)