图像综合处理小设计实验—opencv背景分割,硬币检测

图像综合处理小设计—opencv背景分割,硬币检测

一、机器视觉图像的目标与背景的分割与提取

1.主要要求:

对输入图像可以达到目标和背景的分割 建议方法: (1)将已知图像进行消噪处理 (2)对彩色图像进行目标和背景分析 (3)通过阈值法将图像进行分割 (4)确定目标的位置 实现效果:左一为原始图像,左二为分割提取的目标;右一为要求图片。
在这里插入图片描述

2.算法代码

hsv = cv2.cvtColor(new_img, cv2.COLOR_BGR2HSV)
lower_red = np.array([0,43,46])
upper_red = np.array([10,255,255])
lower_yellow = np.array([20,43,46])
upper_yellow = np.array([34,255,255])
markr = cv2.inRange(hsv, lower_red, upper_red)
marky = cv2.inRange(hsv, lower_yellow, upper_yellow)
#腐蚀运算,腐蚀掉较小噪点
kerne2 = np.ones((9,9),np.uint8)
res1 = cv2.morphologyEx(markr, cv2.MORPH_DILATE, kerne2)
res2 = cv2.morphologyEx(marky, cv2.MORPH_DILATE, kerne2)
cv2.imshow('img_org',new_img)
cv2.imshow("redapple", res1)
cv2.imshow("yellowapple", res2)

3.效果

在这里插入图片描述

二、基于Sobel算子完成对图像的搜索

1.主要要求:

从图像中检索出飞机图像,要求五架飞机全部找到。 建议方法: (1)对待检测图片进行预处理(灰度化、二值化); (2)对图像进行边缘提取; (3)改进算子,使图像达到标准对照图像效果。

2.主要代码

image = cv2.imread('pla.jpeg')  #plane5.jpg
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
ret1, th1 = cv2.threshold(gray, 55, 255, cv2.THRESH_BINARY)
sobel_x = cv2.Sobel(gray,cv2.CV_64F,1,0,3)
sobel_y = cv2.Sobel(gray,cv2.CV_64F,0,1,3)
sobel_x = cv2.convertScaleAbs(sobel_x)
sobel_y = cv2.convertScaleAbs(sobel_y)
sobel_xy = cv2.addWeighted(sobel_x,0.2,sobel_y,0.8,0)
bin = cv2.bitwise_not(th1)
kerne2 = np.ones((3,3),np.uint8)
bin = cv2.morphologyEx(bin, cv2.MORPH_OPEN, kerne2)
images = [image,gray,bin,sobel_xy]
imgaesTitle = ['org', 'gray','bin', 'sobel']
plt.figure()
for i in range(4):
    plt.subplot(2, 2, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(imgaesTitle[i])
plt.show()

3.效果

在这里插入图片描述

三、硬币检测及计数

1.主要要求:

白色背景上扔几枚不同面值的硬币,拍摄图像,通过图像处理,获取硬币的数目及 金额。 建议方法: (1)图像分割; (2)边缘检测、滤波去燥; (3)连通区域检测,判断硬币个数; (4)边缘图像通过霍夫变换检测圆,进而检测硬币金额。

2.主要代码

(1)方法一:canny算子检测边缘

coins = cv2.imread('coin8.jpeg')
#coins = cv2.imread('coin6.jpeg')
n = 0.2
sp = coins.shape
height = round(n * sp[0])
weight = round(n * sp[1])
coins= cv2.resize(coins, (weight, height))
coins_gray = cv2.cvtColor(coins, cv2.COLOR_RGB2GRAY)
blurred = cv2.GaussianBlur(coins_gray, (11, 11), 0)
edge = cv2.Canny(blurred,0,220)  # 用Canny算子提取边缘
cv2.imshow('thresh',edge)
cnts = cv2.findContours(edge.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
print('硬币个数:',len(cnts))
cv2.drawContours(coins, cnts, -1, (0, 0, 255), 2)
cv2.imshow(str(len(cnts))+("coins"), coins)

(2)方法二:霍夫变换检测圆

coins=cv2.imread('coin.jpg')
n = 0.2
sp = coins.shape
height = round(n * sp[0])
weight = round(n * sp[1])
img= cv2.resize(coins, (weight, height))
cv2.imshow('img',img)
#灰度化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#输出图像大小,方便根据图像大小调节minRadius和maxRadius
print('图像调整后大小',img.shape)
#霍夫变换圆检测
circles= cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,100,param1=100,param2=30,minRadius=5,maxRadius=100) #coin.jpg
#输出返回值,方便查看类型
print('所有圆的信息\n',circles)
#输出检测到圆的个数
print('硬币个数为',len(circles[0]))
#根据检测到圆的信息,画出每一个圆
for circle in circles[0]:
    #圆的基本信息
    print(circle[2])
    #坐标行列
    x=int(circle[0])
    y=int(circle[1])
    #半径
    r=int(circle[2])
    #在原图用指定颜色标记出圆的位置
    img=cv2.circle(img,(x,y),r,(0,0,255),3)
for i in range(len(circles[0])):
    r=circles[0][i][2]
    if r>57 and r<63:
        print('硬币面值为1角')
    elif r>63 and r<=68:
        print('硬币面值为5角')
    else:
        print('硬币面值为1元')

3.效果

(1)方法一:canny算子检测边缘
在这里插入图片描述
(2)方法二:霍夫变换检测圆
在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
OpenCV提供了多种图像分割算法,其中一种常用的算法是背景分割背景分割是通过将图像中的前景与背景进行区分,从而实现物体检测和跟踪的目的。 在你提供的引用中的示例代码中,使用了帧间差分法进行背景分割。该方法是通过计算当前帧与前一帧之间的差异,来确定前景与背景之间的变化。具体的步骤如下: 1. 首先,读取视频并获取视频帧率。 2. 在每一帧上进行帧间差分计算。将当前帧与前一帧进行差分操作,得到差异帧。 3. 对差异帧进行阈值分割,将差异值大于阈值的像素置为前景,小于阈值的像素置为背景。 4. 显示原始图像分割结果图像,并添加适当的延时。 然而,根据你提供的引用中的描述,你使用该方法未能成功检测出手掌。这可能是因为帧间差分法对于复杂的背景或者光照变化敏感度较高,导致前景与背景之间的差异不够明显。因此,你可以尝试其他更复杂的背景分割算法,例如基于K-Means聚类、高斯混合模型(GMM)、分水岭变换或Grabcut算法。 引用提供的资源可以帮助你理解这些算法的原理和应用。你可以通过阅读相关文档和尝试实现这些算法来改进你的背景分割结果。 总结起来,要改进你的背景分割结果,你可以尝试使用更复杂的背景分割算法,并参考引用中的相关资源来理解这些算法的原理和应用。这样可以提高你的算法的准确性,并帮助你更好地检测出手掌。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值