使用opencv动态获取子图像
Get Sub Image dynamically using opencv
我想为我的项目提取图像的特定部分。
因为,我将获得的图像是扫描文档,所以特定部分可能会移动一点,所以我无法写入硬编码值
我想从该图像中删除文本,但只有我将那部分标记为红色才能做到这一点
首先将 GaussianBlur
应用于您的图像,例如。 G。内核大小为 3.
使用 Canny
找到具有适当值的边缘后(由于拍摄图像 [扫描] 的条件差别不大,您应该能够找到 min/max 的此类值在精明的情况下)您可以使用 findContours
找到边缘点
使用 minAreaRect
拟合一个矩形。然后裁剪图像的这一部分。
使用膨胀并制作轮廓。只需调整各种功能的参数即可获得所需的输出。
import matplotlib.pyplot as plt
import cv2
import numpy as np
img = cv2.imread('pan2.jpg')
img1 = cv2.GaussianBlur(img,(5,5),0)
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
f1 = cv2.cvtColor(img1,cv2.COLOR_RGB2GRAY)
f1 = 255 - cv2.threshold(f1, 0,255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
fgdilated = cv2.dilate(f1, kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3)) , iterations = 1)
fgclosing = cv2.morphologyEx(fgdilated, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2,2)))
plt.imshow(fgclosing)
plt.show()
img2, contours, hierarchy = cv2.findContours(fgdilated, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
#print(cnt)
#print(cv2.contourArea(cnt))
if cv2.contourArea(cnt) > 200:
#hull = cv2.convexHull(cnt)
#print(hull)
#cv2.drawContours(img, [hull], -1, (255, 255, 255), 1)
(x,y,w,h) = cv2.boundingRect(cnt)
if h >7:
cv2.rectangle(img, (x,y), (x+w,y+h), (255, 0, 255), 1)
plt.imshow(img)
plt.show()
输入:
这是我使用代码得到的二进制图像。
输出:
我想为我的项目提取图像的特定部分。
因为,我将获得的图像是扫描文档,所以特定部分可能会移动一点,所以我无法写入硬编码值
我想从该图像中删除文本,但只有我将那部分标记为红色才能做到这一点
首先将 GaussianBlur
应用于您的图像,例如。 G。内核大小为 3.
使用 Canny
找到具有适当值的边缘后(由于拍摄图像 [扫描] 的条件差别不大,您应该能够找到 min/max 的此类值在精明的情况下)您可以使用 findContours
找到边缘点
使用 minAreaRect
拟合一个矩形。然后裁剪图像的这一部分。
使用膨胀并制作轮廓。只需调整各种功能的参数即可获得所需的输出。
import matplotlib.pyplot as plt
import cv2
import numpy as np
img = cv2.imread('pan2.jpg')
img1 = cv2.GaussianBlur(img,(5,5),0)
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
f1 = cv2.cvtColor(img1,cv2.COLOR_RGB2GRAY)
f1 = 255 - cv2.threshold(f1, 0,255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
fgdilated = cv2.dilate(f1, kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3)) , iterations = 1)
fgclosing = cv2.morphologyEx(fgdilated, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2,2)))
plt.imshow(fgclosing)
plt.show()
img2, contours, hierarchy = cv2.findContours(fgdilated, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
#print(cnt)
#print(cv2.contourArea(cnt))
if cv2.contourArea(cnt) > 200:
#hull = cv2.convexHull(cnt)
#print(hull)
#cv2.drawContours(img, [hull], -1, (255, 255, 255), 1)
(x,y,w,h) = cv2.boundingRect(cnt)
if h >7:
cv2.rectangle(img, (x,y), (x+w,y+h), (255, 0, 255), 1)
plt.imshow(img)
plt.show()
输入:
这是我使用代码得到的二进制图像。
输出: