• split()函数+merge()函数


    在图像处理时,我们接触到的彩色以RGB居多,为了分析图像在某一通道上的特性,需要将图像的颜色通道进行分离,或者是在对某一颜色通道处理后重新进行融合。opencv提供了split()函数来进行颜色通道的分离,提供了merge()函数来进行颜色通道的融合。

    1.split()函数

    此函数的作用是将一个图像通道进行分离。

    split()函数定义:

    void split(const Mat& m, vector<mat>& mv );</mat>

    参数说明:

    • const Mat&类型的src,填我们需要进行分离的图像;
    • vector<mat style="margin-top: 0px;">类型的mv,填函数的输出数组或者输出的vector容器,即分离后的图像;</mat>

    2.merge()函数

    merge()函数的功能是split()函数的逆向操作,将多个数组合并成一个多通道的数组。

    merge()函数定义:

    void merge(const vector<mat>& mv, OutputArray dst );</mat>

    • const <mat style="margin-top: 0px;">类型的mv,填需要被合并的vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度;</mat>
    • 保存为合并后的图像;

    3.利用split()函数和阈值化去除票据上的印章,merge()函数合并图像

    票据上往往会有一些红色印章把一些重要信息区域给覆盖了,比如一些开发票人员盖印章时比较随意,容易吧一些关键区域给遮蔽了,这让接下来的票据识别很困难,因此,我们必须先对票据图像进行一定的预处理来移除印章干扰,再进行字符识别,这样子识别准确率才有保证。


    • 任务:我们需要识别发票的字体(红色盖章影响都我们的识别工作)

    代码如下:

    #include <opencv2/core/core.hpp>  
    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv2/imgproc/imgproc.hpp>  
    #include <iostream>
    using namespace cv;
    using namespace std;
    
    int main() {
    	//【1】定义相关变量
    	Mat srcImage, newImage;
    	Mat srcImage_B, srcImage_G, srcImage_R;
    	//【2】存放Mat的数组vector
    	vector<Mat> channels_BGR;
    	//【3】读取原始图像并检查图像是否读取成功    
    	srcImage = imread("E:\VS2015Opencv\vs2015\project\picture\02.jpg");
    	if (srcImage.empty())
    	{
    		cout << "读取图像有误,请重新输入正确路径!
    ";
    		getchar();
    		return -1;
    	}
    	imshow("src原图像", srcImage);  //在窗口显示原图像
    								 //【4】对加载的原图像进行通道分离,即把一个3通道图像转换成为3个单通道图像  
    	split(srcImage, channels_BGR);
    	//从数组中取出3种颜色,0通道为B分量,1通道为G分量,2通道为R分量。因为:RGB色彩空间在opencv中默认通道顺序为BGR!!!
    	srcImage_B = channels_BGR.at(0);
    	srcImage_G = channels_BGR.at(1);
    	srcImage_R = channels_BGR.at(2);
    	imshow("srcImage_B通道", srcImage_B); //分别显示R,G,B各个通道图像  
    	imshow("srcImage_G通道", srcImage_G);
    	imshow("srcImage_R通道", srcImage_R);
    
    	//【5】 全局二值化
    	Mat gray;
    	cvtColor(srcImage, gray, CV_RGB2GRAY);
    	int th = 170; //阈值要根据实际情况调整
    	Mat binary;
    	//CV_THRESH_BINARY代表阈值其中一种模式,
    	threshold(gray, binary, th, 255, CV_THRESH_BINARY);
    	Mat red_binary;
    	threshold(srcImage_R, red_binary, th, 255, CV_THRESH_BINARY);
    	imshow("灰色图 + 阈值处理 ", binary);
    	imshow("R通道+阈值处理", red_binary);
    	//【6】将3个单通道重新合并成一个三通道图像  
    	merge(channels_BGR, newImage);
    	imshow("将R,G,B通道合并后的图像", newImage);
    	waitKey(0);
    	return 0;
    
    }
    

      上述博文参考:https://www.jianshu.com/p/dcc9c29f10b4

  • 相关阅读:
    #入魔这些年#零度智控&模型控社区大型征文活动,万元大奖等你拿
    2013百度安卓巴士轻应用4城市巡展沙龙,免费报名啦
    专访高磊:安卓APK安全加固的引领者
    Android——程序移植 相关知识总结贴
    iPhone开发视频教程 Objective-C部分 (51课时)
    Android项目实战--手机卫士开发系列教程
    Android——BitMap(位图)相关知识总结贴
    《Linux内核设计与实现》读书笔记
    golang API 请求队列
    自定义Antd Pro 默认元素
  • 原文地址:https://www.cnblogs.com/fcfc940503/p/11246690.html
Copyright © 2020-2023  润新知