zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/fcfc940503/p/11246690.html
Copyright © 2011-2022 走看看