首页 > 解决方案 > 如何使用 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()

plt.show() 命令的结果图 1

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()

plt.show() 命令的结果图 2

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()

plt.show() command3 的结果图

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()

plt.show() 命令的结果图 4

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()

plt.show() command5 的结果图

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()

plt.show() 命令的结果图 6

cv2.imshow('final output',final_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

最终输出

原始图像

由于最终去除背景的图像过于嘈杂,而且与原始图像相比,前景中似乎存在一些颜色差异,有什么可以改进的?

标签: pythonopencvimage-processingbackground-image

解决方案


推荐阅读