图像处理-形态学操作应用-提取水平与水直线

在处理本节的程序时遇到的问题:

 函数使用有问题,内存过载

解决问题:cv::Exception,位于内存位置 0x000000D2956FE120 处_好饿呀~~~的博客-CSDN博客_cv::exception问题描述:当我在visual studio中安装完opencv时,运行第一个Demo文件,出现了如下错误:icrosoft C 异常: cv::Exception,位于内存位置 0x000000D2956FE120 处。执行代码:int main(){//std::string image_path = samples::findFile("starry_night.jpg");std::string image_path = "C:\\Users\\86187\\Desktop\\chttps://blog.csdn.net/qq_51899357/article/details/123328225最后发现

附加依赖项使用的是d.lib文件,库也只用了cv库,错误原因在于:处理jpg图像文件时弹出错误,

png图像文件没有问题,原因??

问题代码:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<opencv2/highgui/highgui_c.h>

using namespace cv;
int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("D:/桌面/code/opencvlearn/配套代码/课程配套代码与图片5/代码与图片/tx.png");
	if (!src.data) {
		printf("could not load image...\n");
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);
	namedWindow("output image", CV_WINDOW_AUTOSIZE);//这行导致输出一个全灰的output图像
	
	Mat gray_src;
	cvtColor(src, gray_src, CV_BGR2BGRA);
	imshow("gray iamge", gray_src);

为什么没有进行灰度处理?

成功调试

正确代码如下:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<opencv2/highgui/highgui_c.h>

using namespace cv;
int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("D:/桌面/code/opencvlearn/配套代码/课程配套代码与图片5/代码与图片/tx.png");
	if (!src.data) {
		printf("could not load image...\n");
	}
	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 image", gray_src);


	

	waitKey(0);
	return 0;
}

总结:多清理解决方案, 给窗口命名时多使用先char编辑窗口名称字符后nameWindow命名的形式

char INPUT_WIN[]="input image";
nameWindow(INPUT_WIN,CV_WINDOW_AUTOSIZE);

原理方法

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

形态学操作 膨胀腐蚀,使用不同的结构元素实现对输入图像

的操作、得到想要的结果。

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

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

二值图像与灰度图像上的膨胀操作-最大像素值

 二值图像与灰度图像上的腐蚀操作-最小像素值

 结构元素

使用任意的结构元素,常见的结构元素有 矩形、园、直线、磁盘形状、砖石形状等各种自定义形状

提取步骤

特别说明 转换为二值图像API: adaptiveThreshold自适应阈值 opencv中自适应阈值(adaptiveThreshold()函数)介绍_若水上善666的博客-CSDN博客_opencv 自适应阈值1. 自适应阈值简介自适应阈值(adaptiveThreshold())用于二值化处理图像,对于对比大的图像有较好效果,相对于固定阈值化操作(t’h)是指图像中每一个像素点是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处:每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的。亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适应地变小。不同亮度、对比度、纹理的局部图像区域将会拥有相对应的局部二值化阈值。1.2 项目目录https://blog.csdn.net/weixin_43977647/article/details/115354680?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166311867316782248516909%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166311867316782248516909&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-115354680-null-null.142%5Ev47%5Epc_rank_34_ecpm25,201%5Ev3%5Econtrol_2&utm_term=%E8%87%AA%E9%80%82%E5%BA%94%E9%98%88%E5%80%BC&spm=1018.2226.3001.4187

ladaptiveThreshold(

Mat src, // 输入的灰度图像

Mat dest, // 二值图像

double maxValue, // 二值图像最大值

int adaptiveMethod // 自适应方法,只能其中之一

           // ADAPTIVE_THRESH_MEAN_C ADAPTIVE_THRESH_GAUSSIAN_C

int thresholdType,// 阈值类型

int blockSize, // 块大小

double C // 常量C 可以是正数,0,负数

)

代码如下:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<opencv2/highgui/highgui_c.h>

using namespace cv;
int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("D:/桌面/code/opencvlearn/配套代码/课程配套代码与图片5/代码与图片/tx.png");
	if (!src.data) {
		printf("could not load image...\n");
	}
	char INPUT_WIN[] = "input image";//char输入窗口
	char OUTPUT_WIN[] = "result image";//char输出窗口
	namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
	namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
	imshow(INPUT_WIN, src);
	
	Mat gray_src;
	cvtColor(src,gray_src, CV_BGR2GRAY);
	imshow("gray image", 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一个结构元素 矩形 Size(src.cols/16,1)代表这是横线,Point(-1,-1)代表结构元素的中心点
	Mat sline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));//Mat一个结构元素 矩形 Size(1,src.rows/16)代表这是竖线,Point(-1,-1)代表结构元素的中心点

	/*Mat temp;先膨胀后腐蚀也就是 开操作
	erode(binImg, temp, hline);
	dilate(temp, dst, hline);*/
	morphologyEx(binImg, dst, CV_MOP_OPEN, sline);//开操作
	bitwise_not(dst, dst);//反色 黑背景换白
	blur(dst, dst, Size(5,5), Point(-1, -1));//模糊 加粗线条
	/*imshow("erode image", temp);*/
	imshow(OUTPUT_WIN, dst);

	waitKey(0);
	return 0;
}

完成效果如下:

水平结构元素hline

竖直结构元素sline

如下是矩形结构元素 kernel 可以过滤掉一些细线的干扰

Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));

  • 29
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值