python - 如何使用 Open cv 准确去除图像的背景?
问题描述
我正在开展一个项目来识别健康和不健康的植物。所以我尝试在输入神经网络和训练模型之前从植物中去除背景。但是当我得到输出时,前景图像中包含噪声。我该怎么做才能去除前景图像中的噪点。
这是我的代码。
import cv2
import numpy as np
import matplotlib .pyplot as plt
from PIL import Image
original_img=cv2.imread('C:\\pictures\\plants\\download2.jpg')
img=cv2.imread('C:\\pictures\\plants\\download2.jpg',0)
blur = cv2.GaussianBlur(img, (5, 5), 0)
sobelx8u= cv2.Sobel(blur,cv2.CV_8U,1,0,ksize=5)
sobelx64f = cv2.Sobel(blur,cv2.CV_64F,1,0,ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)
plt.subplot(1,3,1),plt.imshow(blur,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,2),plt.imshow(sobelx8u,cmap = 'gray')
plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,3),plt.imshow(sobel_8u,cmap = 'gray')
plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([])
plt.show()
median = cv2.medianBlur(sobel_8u,3)
plt.subplot(121),plt.imshow(sobel_8u)
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(median,cmap = 'gray')
plt.title('median Image'), plt.xticks([]), plt.yticks([])
plt.show()
ret2,th2 = cv2.threshold(median,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
plt.subplot(121),plt.imshow(median)
plt.title('median image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(th2,cmap = 'gray')
plt.title(' threshold Image'), plt.xticks([]), plt.yticks([])
plt.show()
kernel = np.ones((3,3),np.uint8)
th3_inv=cv2.morphologyEx(th2, cv2.MORPH_CLOSE, kernel)
plt.subplot(121),plt.imshow(th2)
plt.title(' threshold Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(th3_inv,cmap = 'gray')
plt.title('morphed image '), plt.xticks([]), plt.yticks([])
plt.show()
mask=np.zeros(img.shape[:2],np.uint8)
mask_inv = cv2.bitwise_not(mask)
rgb_image=cv2.cvtColor(original_img,cv2.COLOR_BGR2RGB)
kernel = np.ones((3,3),np.uint8)
cv2.morphologyEx(th3_inv, cv2.MORPH_OPEN, kernel)
img1_bg = cv2.bitwise_and(blur,th3_inv,mask = mask_inv)
plt.subplot(121),plt.imshow(rgb_image)
plt.title('rgb Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img1_bg,cmap = 'gray')
plt.title('background removed image '), plt.xticks([]), plt.yticks([])
plt.show()
bgr_new_image = cv2.cvtColor(img1_bg, cv2.COLOR_GRAY2BGR)*255
rgb_new_image=cv2.cvtColor(bgr_new_image,cv2.COLOR_BGR2RGB)*255
final_image=cv2.bitwise_and(rgb_new_image,rgb_image)
cv2.fastNlMeansDenoisingColored(final_image,None,10,10,7,21)
plt.subplot(121),plt.imshow(rgb_image)
plt.title('rgb Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(final_image,cmap = 'gray')
plt.title('background removed image '), plt.xticks([]), plt.yticks([])
plt.show()
cv2.imshow('final output',final_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
由于最终去除背景的图像过于嘈杂,而且与原始图像相比,前景中似乎存在一些颜色差异,有什么可以改进的?
解决方案
推荐阅读
- javascript - 材质ui单选按钮组中的Reactjs不受控制的组件错误
- airflow - 异常如何传递给 on_failure_callback?
- java - 如何为泛型列表创建约束验证器
- json - 如何删除空数组并优化我的 POST 请求?
- python - 在 password_change_form.html Django 管理员上添加一个眼睛图标
- java - Spring Boot factoryBean 在创建对象时抛出异常
- deep-learning - 在没有激活函数的情况下将两个卷积层依次放置是否有意义
- github - 在 Anima(html 代码注入)上获取 mp3(来自 Github repo)
- kotlin - jOOQ 3.15.1 新的 ad-hoc 转换 API 是否在 Kotlin 中工作?
- javascript - 如何将数据从 jquery 代码传递到我的项目后端