图像处理之提取水平线和垂直线

提取图像中的水平线和垂直线,是对图像的处理非常有好处的,能够筛选出对自己有用的、感兴趣的部分。比如从富有干扰杂质的验证码中提取干净的验证码。

从这样:  变成这样:

就可以轻松看出验证码了。当然,这只是其中的一个小例子,还有很多实例等着去开发。

下面回到我们的主题,提取水平线和垂直线,我们首先要将图像灰度化,然后再二值化,最后进行形态学的操作(腐蚀和膨胀),达到提取水平和垂直线的要求。下面分别用Python和C++实现这个过程。

先用python实现:

#! /usr/bin/env python
# -*- coding:utf-8 -*-
import cv2
src = cv2.imread("bin1.png")
gray_src = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
cv2.imshow("input image", src)
cv2.imshow("gray image", gray_src)
gray_src = cv2.bitwise_not(gray_src)
binary_src = cv2.adaptiveThreshold(gray_src, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 15, -2)
cv2.namedWindow("result image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("result image", binary_src)
# 提取水平线
hline = cv2.getStructuringElement(cv2.MORPH_RECT, ((src.shape[1] / 16), 1), (-1, -1))
# 提取垂直线
vline = cv2.getStructuringElement(cv2.MORPH_RECT, (1, (src.shape[0] / 16)), (-1, -1))
# 这两步就是形态学的开操作——先腐蚀再膨胀
# temp = cv2.erode(binary_src, hline)
# dst = cv2.dilate(temp, hline)
dst = cv2.morphologyEx(binary_src, cv2.MORPH_OPEN, vline)
dst = cv2.bitwise_not(dst)
cv2.imshow("Final image", dst)
cv2.waitKey(0)

图像展示(垂直线):


图像展示(水平线):



可以看出完全的分别提取出了水平线和垂直线。


通过C++实现也能达到同样的效果,图这里就不显示了:

# include <opencv2/opencv.hpp>
# include <iostream>


using namespace cv;
int main(int argc, char* argv) {
	Mat src, dst;
	src = imread("C:/Users/12914/Pictures/char1.png");
	if (src.empty()) {
		printf("Could not load image...\n");
		return -1;
	}
	char INPUT_WIN[] = "input image";
	char OUTPUT_WIN[] = "result image";
	namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
	imshow(INPUT_WIN, src);
	// 变成灰度图像
	Mat gray_src;
	cvtColor(src, gray_src, CV_BGR2GRAY);
	imshow("gray_src", gray_src);

	//变成二值图像
	Mat binImg;
	adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
	imshow("binary image", binImg);

	//水平结构元素
	Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
	//垂直结构元素
	Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
	

	// 形态学开操作——先腐蚀后膨胀
	Mat temp;
	//erode(binImg, temp, hline);
	//dilate(temp, dst, hline);
	morphologyEx(binImg, dst, CV_MOP_OPEN, hline);
	bitwise_not(dst, dst);
	//blur(dst, dst, Size(3, 3), Point(-1, -1));
	imshow("Final Result", dst);
	imwrite("C:/Users/12914/Pictures/char1_change.png", dst);
	waitKey(0);
	return 0;
}



  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值