设为首页收藏本站 |天气与日历| 2025-08-23 星期六 05:20:00 乙巳(蛇)年 七月初一 卯时 处暑
     
切换到窄版

私人站点

 找回密码
 立即注册
搜索
查看: 254|回复: 0

形态学操作应用-提取水平与垂直线

[复制链接]

954

主题

954

帖子

3879

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3879
发表于 2022-2-26 13:01:20 | 显示全部楼层 |阅读模式
原理方法
实现步骤
代码演示




原理方法

图像形态学操作时候,可以通过自定义的结构元素实现结构元素
对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏
感的对象改变而不敏感的对象保留输出。通过使用两个最基本的
形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像
的操作、得到想要的结果。

- 膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值
- 腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值


二值图像与灰度图像上的膨胀操作



123.png



二值图像与灰度图像上的腐蚀操作



456.png




结构元素

上述膨胀与腐蚀过程可以使用任意的结构元素
常见的形状:矩形、园、直线、磁盘形状、砖石形状等各种自定义形状。

789.png




提取步骤
输入图像彩色图像 imread
转换为灰度图像 – cvtColor
转换为二值图像 – adaptiveThreshold
定义结构元素
开操作 (腐蚀+膨胀)提取 水平与垂直线


代码实现-第一步输入彩色图像 imread
转换为灰度图像 – cvtColor

转换为二值图像 – adaptiveThreshold

定义结构元素

开操作(腐蚀+膨胀)-检测

bitwise_not(Mat bin, Mat dst)像素取反操作,255 – SrcPixel
模糊(blur)

[C++] 纯文本查看 复制代码
/*
注意:
利用水平结构 和垂直结构提取水平和垂直

void adaptiveThreshold(
InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod, 
int thresholdType,
int blockSize,
double C)
参数:
InputArray src:源图像

OutputArray dst:输出图像,与源图像大小一致

int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。

ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值。

ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值。

int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV  具体的请看官方的说明,这里不多做解释。

int blockSize:adaptiveThreshold的计算单位是像素的邻域块,这是局部邻域大小,3、5、7等。

double C:这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。

注:相比OpenCV的API,我多用了一个中值法确定阈值。

*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
        Mat src, dst,temp;
        src = imread("yzm.jpeg");
        if (!src.data) {
                printf("加载图片异常\n");
                return -1;
        }

        namedWindow("input", CV_WINDOW_AUTOSIZE);
        imshow("input", src); 
        
        //cvtColor(src, dst, CV_BGR2GRAY);

        Mat gray_src;
        cvtColor(src, gray_src, CV_BGR2GRAY);
        imshow("灰度图效果", gray_src);
        //转成成灰度图
        Mat binimg;
        adaptiveThreshold(~gray_src, binimg, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 15, -2);
        //转换二值图像
        imshow("二值图像", 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));
        //提取竖线结构元素
        erode(binimg, temp, vline);
        //腐蚀
        dilate(temp, dst, vline);
        //膨胀
        /*
        morphologyEx(binimg,dst, CV_MOP_OPEN, vline);
        利用开操作同样实现相同操作*/
        bitwise_not(dst, dst);
        //背景变白
        blur(dst, dst, Size(3, 3), Point(-1, -1));
        //利用blur模糊美化线条效果
        imshow("最终效果", dst);
        waitKey(0);
        return 0;
}


999.jpg



实际案列的运用:(验证码去干扰)
[C++] 纯文本查看 复制代码
/*
注意:
利用水平结构 和垂直结构提取水平和垂直

void adaptiveThreshold(
InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod, 
int thresholdType,
int blockSize,
double C)
参数:
InputArray src:源图像

OutputArray dst:输出图像,与源图像大小一致

int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。

ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值。

ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值。

int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV  具体的请看官方的说明,这里不多做解释。

int blockSize:adaptiveThreshold的计算单位是像素的邻域块,这是局部邻域大小,3、5、7等。

double C:这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。

注:相比OpenCV的API,我多用了一个中值法确定阈值。

*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
	Mat src, dst,temp;
	src = imread("gg.jpg");
	if (!src.data) {
		printf("加载图片异常\n");
		return -1;
	}

	namedWindow("input", CV_WINDOW_AUTOSIZE);
	imshow("input", src); 
	
	//cvtColor(src, dst, CV_BGR2GRAY);

	Mat gray_src;
	cvtColor(src, gray_src, CV_BGR2GRAY);
	imshow("灰度图效果", gray_src);
	//转成成灰度图
	Mat binimg;
	adaptiveThreshold(~gray_src, binimg, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 15, -2);
	//转换二值图像
	imshow("二值图像", binimg);


	Mat kernrl = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	//矩形结构
	erode(binimg, temp, kernrl);
	//腐蚀
	dilate(temp, dst, kernrl);
	//膨胀
	/*
	morphologyEx(binimg,dst, CV_MOP_OPEN, kernrl);
	利用开操作同样实现相同操作*/
	bitwise_not(dst, dst);
	//背景变白

	imshow("验证码去干扰", dst);
	waitKey(0);
	return 0;
}

1120.jpg









回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|编程站点 ( 冀ICP备2023028127号-2 )|友链申请|

GMT+8, 2025-8-23 05:20 , Processed in 0.101961 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表