简单的说,就是最近需要做图像处理相关的项目,之前没关注过这个领域,突然接触,还是很多细节思路不明白,中间想了很多临时方案,解决过程,最后探索的结果是用不上,不过也有部分东西可以留下思路作为借鉴。
图像提取轮廓,庆幸找到用 Python 和 OpenCV 检测图片上的条形码这篇文章,学了一些处理的思路和方法。这个也是整个处理过程的基础。这里简单说一个探索过程,就是提取轮廓,目标国徽。
opencv版本不一样,用到的api还是有区别的,这里用到的版本是2.4.13
截取一张国徽照片,参考上面的文章,先做灰度,模糊,二值化,再做闭运算,之后4次腐蚀,4次膨胀,之后查找轮廓,在原图画一个轮廓,看起来不是很理想。
def get_guohui2():
#获取国徽轮廓
img = cv2.imread("pic/guohui0.jpg")
#灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#模糊
blurred = cv2.blur(gray, (9, 9))
#二值化
(_, thresh) = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("image", thresh)
cv2.waitKey(0)
#闭运算
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40, 20))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# perform a series of erosions and dilations
#腐蚀、膨胀
close = cv2.erode(close, None, iterations = 4)
close = cv2.dilate(close, None, iterations = 4)
cv2.imshow("image", close)
cv2.waitKey(0)
#查找轮廓
(contours, _) = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
cv2.imshow("image", img)
cv2.waitKey(0)
后面改了先开运算再闭运算,再调整一些参数,看起来效果好多了
def get_guohui2():
#获取国徽轮廓
img = cv2.imread("pic/guohui0.jpg")
#灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#模糊
blurred = cv2.blur(gray, (3, 3))
#二值化
(_, thresh) = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("image", thresh)
cv2.waitKey(0)
#开运算
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
open = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
# perform a series of erosions and dilations
#腐蚀、膨胀
open = cv2.erode(open, None, iterations = 4)
open = cv2.dilate(open, None, iterations = 4)
cv2.imshow("image", open)
cv2.waitKey(0)
#闭运算
close = cv2.morphologyEx(open, cv2.MORPH_CLOSE, kernel)
cv2.imshow("image", close)
cv2.waitKey(0)
#查找轮廓
(contours, _) = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
cv2.imshow("image", img)
cv2.waitKey(0)
但是还有一些缺陷,不够完整,后面想到,可能是边缘不够明显,于是找了怎么锐化边缘,找到OpenCV图像处理 空间域图像增强(图像锐化 1 基于拉普拉斯算子)。里面都是C++的代码,参考了一下,用了矩阵,小改就完成了。锐化后没做模糊操作。
def get_guohui2():
#获取国徽轮廓
img = cv2.imread("pic/guohui0.jpg")
#锐化操作
kernel = np.matrix('0 -1 0; -1 5 -1; 0 -1 0')
dst = cv2.filter2D(img,-1,kernel)
cv2.imshow("Result", dst)
cv2.waitKey(0)
#灰度
gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
#二值化
(_, thresh) = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("image", thresh)
cv2.waitKey(0)
#开运算
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
open = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
# perform a series of erosions and dilations
#腐蚀、膨胀
open = cv2.erode(open, None, iterations = 4)
open = cv2.dilate(open, None, iterations = 4)
cv2.imshow("image", open)
cv2.waitKey(0)
#闭运算
close = cv2.morphologyEx(open, cv2.MORPH_CLOSE, kernel)
cv2.imshow("image", close)
cv2.waitKey(0)
#查找轮廓
(contours, _) = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
area = cv2.contourArea(contours[0])
print area
cv2.drawContours(img, [contours[1]], -1, (0, 255, 0), 3)
cv2.imshow("image", img)
cv2.waitKey(0)
完。