import cv2
import numpy as np
class Detect(object):
# 将RGB图像转为HSI图像 返回h通道,s通道,i通道图像以及hsi图像
def rgb2hsi(self, image):
b, g, r = cv2.split(image) # 读取通道
r = r / 255.0 # 归一化
g = g / 255.0
b = b / 255.0
eps = 1e-6 # 防止除零
img_i = (r + g + b) / 3 # I分量
img_h = np.zeros(r.shape, dtype=np.float32)
img_s = np.zeros(r.shape, dtype=np.float32)
min_rgb = np.zeros(r.shape, dtype=np.float32)
# 获取RGB中最小值
min_rgb = np.where((r <= g) & (r <= b), r, min_rgb)
min_rgb = np.where((g <= r) & (g <= b), g, min_rgb)
min_rgb = np.where((b <= g) & (b <= r), b, min_rgb)
img_s = 1 - 3 * min_rgb / (r + g + b + eps) # S分量
num = ((r - g) + (r - b)) / 2
den = np.sqrt((r - g) ** 2 + (r - b) * (g - b))
theta = np.arccos(num / (den + eps))
img_h = np.where((b - g) > 0, 2 * np.pi - theta, theta) # H分量
img_h = np.where(img_s == 0, 0, img_h)
img_h = img_h / (2 * np.pi) # 归一化
temp_s = img_s - np.min(img_s)
temp_i = img_i - np.min(img_i)
img_s = temp_s / np.max(temp_s)
img_i = temp_i / np.max(temp_i)
image_hsi = cv2.merge([img_h, img_s, img_i])
return img_h, img_s, img_i, image_hsi
def nothing(self, x):
pass
# 图像预处理与轮廓获取
def findcont(self, image):
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
reval_T_2, dst_Tri_2 = cv2.threshold(image, 10, 255, cv2.THRESH_BINARY_INV)
dst_Tri_2 = ~dst_Tri_2 # 黑白像素转置
contours, hierarchy = cv2.findContours(dst_Tri_2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
return contours, hierarchy
# 获取最大面积轮廓的凸包并返回
def get_hull(self, contours):
# 找到最大面积的轮廓
area = []
for i in range(len(contours)):
area.append(cv2.contourArea(contours[i]))
max_index = np.argmax(np.array(area))
# 获取最大面积的凸包[hull]
hull = cv2.convexHull(contours[max_index])
return hull
# 获取凸包hull的roi区域并返回
def return_roi(self, height, width, hull):
roi = np.zeros((height, width), dtype=np.uint8)
roi.fill(128)
cv2.fillPoly(roi, [hull], (255), 8, 0)
return roi
# 获取图像中黑色像素的个数
def get_blackNum(self, height, width, image):
# 建立一个与图像尺寸相同的全零数组
npim = np.zeros((height, width), dtype=np.uint8)
# 将图像3个通道相加赋值给空数组
npim[:] = image[:, :]
cont = len(npim[npim == 0])
return cont
# 判断是否是好果子
def judge_ifgood(self, cont, hull_area, image):
font = cv2.FONT_HERSHEY_SIMPLEX
if (cont / hull_area <= 0.2):
cv2.putText(image, "This is good", (0, 250), font, 3, (0, 255, 0), 15,
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX)
else:
cv2.putText(image, "This is bad", (0, 250), font, 3, (0, 255, 0), 15,
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX)
return image
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源介绍】 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 基于opencv和python的柚子缺陷检测 本项目用于在工业上对于柚子的缺陷检测(其他水果基本思路大致相同) 由于打部分的水果坏掉之后呈现出黑色 而又因为水果正常表皮颜色和黑色有较大的区别 因此我观察到 可以根据饱和度的不同来提取出柚子表皮上黑色的斑块 后续工作:可根据检测出黑色斑块较整个水果的面积大小占比 来确定这个水果是否是我们不需要的水果(所需要剔除的水果) 暂时这份代码只停留在用于单张图像检测部分 后续需要使用工业相机只需要加入相机SDK即可
资源推荐
资源详情
资源评论
收起资源包目录
基于OpenCV和Python实现柚子缺陷识别检测源码+详细代码注释.zip (33个子文件)
项目说明.md 646B
main.py 2KB
.idea
misc.xml 185B
inspectionProfiles
profiles_settings.xml 174B
modules.xml 284B
.gitignore 47B
youzi-detecition.iml 284B
youzi-picture
Image14.jpg 39KB
Image15.jpg 33KB
Image19.jpg 43KB
Image2.jpg 40KB
Image16.jpg 33KB
Image22.jpg 42KB
Image4.jpg 42KB
Image6.jpg 39KB
Image13.jpg 45KB
Image10.jpg 37KB
Image7.jpg 46KB
Image18.jpg 39KB
Image1.jpg 42KB
Image17.jpg 31KB
Image5.jpg 32KB
Image21.jpg 40KB
Image3.jpg 40KB
Image23.jpg 41KB
Image8.jpg 36KB
Image9.jpg 35KB
Image20.jpg 43KB
Image12.jpg 33KB
Image11.jpg 34KB
header.py 3KB
__pycache__
header.cpython-38.pyc 3KB
header.cpython-39.pyc 3KB
共 33 条
- 1
资源评论
- yyyhkxnx12024-01-19感谢大佬,让我及时解决了当下的问题,解燃眉之急,必须支持!
z同学的编程之路
- 粉丝: 1882
- 资源: 2130
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功