我有一些苹果片的照片,这些苹果片已经被泡在碘溶液中了。我的目标是将苹果分成单独的兴趣区域,并评估每个区域的淀粉水平。这是一个学校项目,所以我的目标是测试不同的分割方法,并客观地找到最佳解决方案,无论是单一技术还是多种技术的组合。
问题在于,到目前为止,我只接近完成了一种方法。该方法是使用HoughCircles。我最初计划使用Watershed方法、形态学操作或简单的阈值处理。当我无法修改任何一个使其工作时,这个计划失败了。
原始图像看起来类似于这样,苹果颜色的深浅不同
我尝试使用HSV值的cv2.inRange消除背景托盘,但它与较暗的苹果配合效果不佳。
下面是HoughCircles在应用了灰度和中值模糊后对原始图像产生的效果,同时还尝试了遮罩托盘。
如果可以提供代码,那将非常感谢。
编辑1:添加一些代码并澄清问题
谢谢你们的回答。我真正的问题是这种情况是否适合其他分割方法?我想尝试几种不同的方法,并比较大量照片的结果。我接下来要尝试的是使用k-means分割。此外,我将添加一些代码,展示我到目前为止所尝试的内容。
颜色过滤采用HSV。
霍夫圆变换(Hough Circles)
问题在于,到目前为止,我只接近完成了一种方法。该方法是使用HoughCircles。我最初计划使用Watershed方法、形态学操作或简单的阈值处理。当我无法修改任何一个使其工作时,这个计划失败了。
原始图像看起来类似于这样,苹果颜色的深浅不同
我尝试使用HSV值的cv2.inRange消除背景托盘,但它与较暗的苹果配合效果不佳。
下面是HoughCircles在应用了灰度和中值模糊后对原始图像产生的效果,同时还尝试了遮罩托盘。
如果可以提供代码,那将非常感谢。
编辑1:添加一些代码并澄清问题
谢谢你们的回答。我真正的问题是这种情况是否适合其他分割方法?我想尝试几种不同的方法,并比较大量照片的结果。我接下来要尝试的是使用k-means分割。此外,我将添加一些代码,展示我到目前为止所尝试的内容。
颜色过滤采用HSV。
import cv2
import numpy as np
# Load image
image = cv2.imread('ApplePic.jpg')
# Set minimum and max HSV values to display
lower = np.array([0, 0, 0])
upper = np.array([105, 200, 255])
# Create HSV Image and threshold into a range.
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower, upper)
maskedImage = cv2.bitwise_and(image, image, mask=mask)
# Show Image
cv2.imshow('HSV Mask', image)
cv2.waitKey(0)
霍夫圆变换(Hough Circles)
# import the necessary packages
import numpy as np
import argparse
import cv2
import os
directory = os.fsencode('Photos\\Sample N 100')
for file in os.listdir(directory):
filename = os.fsdecode(file)
if filename.endswith('.jpg'):
# Load the image
image = cv2.imread('Photos\\Sample N 100\\' + filename)
# Calculate scale
scale_factor = 800 / image.shape[0]
width = int(image.shape[1] * scale_factor)
height = 800
dimension = (width, height)
min_radius = int((width / 10) * .8)
max_radius = int((width / 10) * 1.2)
# Resize image
image = cv2.resize(image, dimension, interpolation=cv2.INTER_AREA)
# Copy Image
output = image.copy()
# Grayscale Image
gray = cv2.medianBlur(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY), 5)
# Detect circles in image
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, min_radius * 2, 4, 60, 20, min_radius, max_radius)
# ensure at least some circles were found
if circles is not None:
# convert the (x, y) coordinates and radius of the circles to integers
circles = np.round(circles[0, :]).astype("int")
# loop over the (x, y) coordinates and radius of the circles
for (x, y, r) in circles:
# draw the circle in the output image, then draw a rectangle
# corresponding to the center of the circle
cv2.circle(output, (x, y), r, (0, 255, 0), 4)
cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
cv2.putText(output, '(' + str(x) + ',' + str(y) + ',' + str(r) + ')', (x, y),
cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, 255)
# show the output image
cv2.imshow("output", np.hstack([image, output, maskedImage]))
cv2.waitKey(0)
continue
else:
continue