Jac*_*eoh 5 python opencv image
我试图删除图像中的噪音较少,目前正在运行此代码
import numpy as np
import argparse
import cv2
from skimage import morphology
# Construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True,
help = "Path to the image")
args = vars(ap.parse_args())
# Load the image, convert it to grayscale, and blur it slightly
image = cv2.imread(args["image"])
cv2.imshow("Image", image)
cv2.imwrite("image.jpg", image)
greenLower = np.array([50, 100, 0], dtype = "uint8")
greenUpper = np.array([120, 255, 120], dtype = "uint8")
green = cv2.inRange(image, greenLower, greenUpper)
#green = cv2.GaussianBlur(green, (3, 3), 0)
cv2.imshow("green", green)
cv2.imwrite("green.jpg", green)
cleaned = morphology.remove_small_objects(green, min_size=64, connectivity=2)
cv2.imshow("cleaned", cleaned)
cv2.imwrite("cleaned.jpg", cleaned)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)
但是,尽管使用了remove_small_objects函数,但图像似乎没有从"绿色"更改为"已清除".为什么这样,我如何清理图像?理想情况下,我想只隔离卷心菜的图像.
我的思维过程是在阈值处理后删除小于100的像素,然后用模糊平滑图像并填充白色包围的黑洞 - 这就是我在matlab中所做的.如果有人可以指示我获得与我的matlab实现相同的结果,那将非常感激.谢谢你的帮助.
编辑:更改代码时出现一些错误,更新为现在的错误并显示3个图像
图片:
绿色:
清洁:
我的目标是从matlab实现中得到如下图所示的内容:
当你过滤图像时,一个好主意是低通图像或模糊一点; 这样,相邻像素的颜色变得更加均匀,因此它可以减轻图像上更亮更暗的斑点,并防止面具上的孔洞.
img = cv2.imread('image.jpg')
blur = cv2.GaussianBlur(img, (15, 15), 2)
lower_green = np.array([50, 100, 0])
upper_green = np.array([120, 255, 120])
mask = cv2.inRange(blur, lower_green, upper_green)
masked_img = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('', masked_img)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)
目前,您试图通过一系列具有不同亮度的颜色来包含图像 - 您想要绿色像素,无论它们是暗还是亮.这在HSV颜色空间中更容易实现.在这里查看我的答案,深入了解HSV色彩空间.
img = cv2.imread('image.jpg')
blur = cv2.GaussianBlur(img, (15, 15), 2)
hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)
lower_green = np.array([37, 0, 0])
upper_green = np.array([179, 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
masked_img = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('', masked_img)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)
该答案提供ngalstyan展示了如何用形态学很好地做到这一点.你想要做的是打开,这是侵蚀的组合过程(或多或少只是删除某个半径内的所有东西),然后扩张(这会增加回任何剩余的物体,但是除去了很多).在OpenCV中,这是通过完成的cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel).该页面上的教程展示了它如何很好地工作.
img = cv2.imread('image.jpg')
blur = cv2.GaussianBlur(img, (15, 15), 2)
hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)
lower_green = np.array([37, 0, 0])
upper_green = np.array([179, 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15))
opened_mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
masked_img = cv2.bitwise_and(img, img, mask=opened_mask)
cv2.imshow('', masked_img)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)
在上面,开口显示为从二进制掩码中删除少量白色的方法.关闭是相反的操作 - 从图像中移除被白色包围的黑色块.您可以使用与上面相同的想法执行此操作,但使用cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel).在您的情况下,在上述情况之后甚至不需要这样做,因为面具没有任何孔.但如果确实如此,你可以关闭它们.您会注意到我的开启步骤实际上移除了底部的一小部分植物.实际上,您可以先关闭这些间隙,然后打开以删除其他地方的虚假位,但这可能不是此图像所必需的.
您可能希望更舒适地使用不同的颜色空间和阈值级别来感受对特定图像最有效的方法.它还没有完成,界面有点不稳定,但我有一个工具可以在线使用,在不同的颜色空间中尝试不同的阈值; 如果你愿意,请在这里查看.这就是我如何快速找到你的图像的价值.