回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一组图片,所有的看起来都像这片叶子:</p>
<p><a href="https://i.stack.imgur.com/3uoZF.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/3uoZF.jpg" alt="low resolution image..."/></a></p>
<p>我想从背景中提取叶子,为此我使用了<code>GrabCut</code>算法作为<a href="https://stackoverflow.com/questions/51031733/detection-of-leaf-on-unpredictable-background">here</a>。你知道吗</p>
<p>作为一种不同的方法,我还使用了基于r、g和b值比率的阈值,如下所示:</p>
<pre><code>import numpy as np
import cv2
import matplotlib.pyplot as plt
testImg = cv2.imread('path_to_the_image')
testImg = cv2.resize(testImg, (256, 256))
#bgImg = cv2.imread('')
#blurBg = cv2.GaussianBlur(bgImg, (5, 5), 0)
#blurBg = cv2.resize(blurBg, (256, 256))
#testImg = cv2.GaussianBlur(testImg, (5, 5), 0)
cv2.imshow('testImg', testImg)
#plt.imshow(bgImg)
cv2.waitKey(0)
#plt.show()
modiImg = testImg.copy()
ht, wd = modiImg.shape[:2]
print(modiImg[0][0][0])
for i in range(ht):
for j in range(wd):
r = modiImg[i][j][0]
g = modiImg[i][j][1]
b = modiImg[i][j][2]
r1 = r/g
r2 = g/b
r3 = r/b
r4 = round((r1+r2+r3)/3, 1)
if g > r and g > b:
modiImg[i][j] = [255, 255, 255]
elif r4 >= 1.2:
modiImg[i][j] = [255, 255, 255]
else:
modiImg[i][j] = [0, 0, 0]
# if r4 <= 1.1:
# modiImg[i][j] = [0, 0, 0]
# elif g > r and g > b:
# modiImg[i][j] = [255, 255, 255]
# else:
# modiImg[i][j] = [255, 255, 255]
# elif r4 >= 1.2:
# modiImg[i][j] = [255, 255, 255]
# else:
# modiImg[i][j] = [0, 0, 0]
plt.imshow(modiImg)
plt.show()
testImg = testImg.astype(float)
alpha = modiImg.astype(float) / 255
testImg = cv2.multiply(alpha, testImg)
cv2.imshow('final', testImg/255)
cv2.waitKey(0)
</code></pre>
<p>但是在提取的叶子图像中,叶子上的黑点总是丢失,如下所示:</p>
<p><a href="https://i.stack.imgur.com/fHswG.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/fHswG.png" alt="enter image description here"/></a></p>
<p>有没有其他方法把叶子从它的背景中分离出来,假设每幅图像只有一片叶子,背景和我的其他图像一样,叶子的位置也和这里一样。你知道吗</p>