OpenCV图像处理

OpenCV实现图像的灰度化->二值化->Canny边缘检测以及对比度(Contrast)和亮度(Brightness)值调整

图像灰度化:简单的来说就是使R,G,B value在阈值[0,255]间取得相同的值,总共有256个等级,黑白两种颜色其实可以看成是灰度化处于两个极端时的情形,中间254个等级分别代表灰度化的程度(浅深)。

图像二值化:简单的来说就是将图像上的像素点的灰度值设置为(0,0,0)(黑色)或(255,255,255)(白色),使图像只呈现出明显的黑白效果。

Canny算子:其目的是找到一个最优的边缘检测算法,使其满足三个主要的标准:

                 1.低错误率:标识出尽可能多的边缘,同时尽量减少噪声产生的影响;

                 2.高定位:标识出的边缘应与图像的实际边缘尽可能接近;

                 3.最小响应:图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

Canny边缘检测步骤:滤波->计算梯度幅值和方向->非极大值抑制(排除非边缘像素,保留候选边缘)  (每个步骤的具体原理可参考OpenCV3编程入门这本书,百度一下pdf版应该就能找到,建议最好买一本,声明一下:绝对不是打广告  (●‘?‘●))。

亮度和对比度调整:首先应了解点操作(点算子)这个概念:根据输入像素值(有时可加上某些全局信息或参数),来计算输出像素的值。这类算子包括亮度和对比度调整,颜色校正(colorcorrection)和变换(transformations)。两种最常用的点操作满足下式:

g(i,j)=a*f(i,j)+b

                              (a控制对比度,b控制亮度,f(i,j)为源图像像素,g(i,j)为输出图像像素)                                                      

                  本Demo中也是使用三个for循环来执行图像亮度与对比度的调整。废话不多说,代码不会骗人,(●‘?‘●)。

工程代码如下:

//-----------------------------------【头文件包含部分】-----------------------------------------
//    描述:包含程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include <cv.h>
#include <highgui.h>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

//-----------------------------------【命名空间声明部分】--------------------------------------
//    描述:包含程序所使用的命名空间
//---------------------------------------------------------------------------------------------
using namespace std;
using namespace cv;

//-----------------------------------【全局变量声明部分】--------------------------------------
//    描述:全局变量声明
//---------------------------------------------------------------------------------------------
int g_nContrastValue; //对比度值
int g_nBrightValue;  //亮度值
int Thresh = 50;

//-----------------------------------【全局函数声明部分】--------------------------------------
//    描述:全局函数声明
//---------------------------------------------------------------------------------------------
static void ContrastAndBright(int);
void   ShowHelpText();

//-----------------------------------【声明图像IplImage指针】----------------------------------
//描述:声明图像IplImage指针
//---------------------------------------------------------------------------------------------
IplImage* g_pSrcImg = NULL;

IplImage* g_pGrayImage = NULL;

IplImage* g_pCannyImg = NULL;

IplImage *g_pBinaryImage = NULL;

IplImage *g_pDstImage = NULL;

//滑动条响应函数

void onTrackerSlid(int thresh)

{

    cvCanny(g_pGrayImage, g_pCannyImg, (float)thresh, (float)thresh * 3, 3);

    cvShowImage("Canny Image", g_pCannyImg);

}

//-----------------------------【on_trackbar( )函数】------------------------------------
//    描述:图像二值化阈值回调函数
//-----------------------------------------------------------------------------------------------
void on_trackbar(int pos)
{
    // 转为二值图 
    cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);
    // 显示二值图 
    cvShowImage("Binary Image", g_pBinaryImage);
}

//-----------------------------------【main( )函数】--------------------------------------------
//    描述:控制台应用程序的入口函数,程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main(int argc, char** argv)

{
    system("color 5F");
    ShowHelpText();
    if (argc != 2)

        argv[1] = "1.jpg";

    //设定对比度和亮度的初值

    g_nContrastValue = 80;
    g_nBrightValue = 80;

    //载入图像,强制转化为Gray

    if ((g_pSrcImg = cvLoadImage(argv[1], 1)) != 0)

    {

        cout << "Press ESC to Quit" << endl;

        //将颜色空间由RGB转化为Gray

        g_pGrayImage = cvCreateImage(cvGetSize(g_pSrcImg), 8, 1);

        cvCvtColor(g_pSrcImg, g_pGrayImage, CV_RGB2GRAY);

        // 创建二值图 
        g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);

        //canny边缘检测

        g_pCannyImg = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);

        cvNamedWindow("ContrastandBrightnessWnd", CV_WINDOW_AUTOSIZE);

        //创建轨迹条

        cvCreateTrackbar("Contrast:", "ContrastandBrightnessWnd", &g_nContrastValue, 300, ContrastAndBright);
        cvCreateTrackbar("Brightness:", "ContrastandBrightnessWnd", &g_nBrightValue, 200, ContrastAndBright);

        //调用回调函数
        ContrastAndBright(g_nContrastValue);
        ContrastAndBright(g_nBrightValue);

        //创建窗口

        cvNamedWindow("Source Image", CV_WINDOW_AUTOSIZE);

        cvNamedWindow("Gray Image",  CV_WINDOW_AUTOSIZE);

        cvNamedWindow("Canny Image", CV_WINDOW_AUTOSIZE);

        cvNamedWindow("Binary Image", CV_WINDOW_AUTOSIZE);
       

        // 滑动条   
        int nThreshold = 0;
        cvCreateTrackbar("Threshold:", "Binary Image", &nThreshold, 254, on_trackbar);
        on_trackbar(1);

        //添加滑动条来调节边缘检测的阈值

        onTrackerSlid(Thresh);

        cvShowImage("Gray Image", g_pCannyImg);

        cvCreateTrackbar("Threshold", "Canny Image", &Thresh, 300, onTrackerSlid);
       
        //显示图像

        cvShowImage("Source Image", g_pSrcImg);

        cvShowImage("Gray Image", g_pGrayImage);

        //保存图像

        cvSaveImage("Gray_Image.jpg", g_pGrayImage);

        cvSaveImage("Canny_Image.jpg", g_pCannyImg);
       
        cvSaveImage("Binary Image.jpg", g_pBinaryImage);
   
       
        //等待按"ESC"键退出

        while (1)

            if (cvWaitKey(100) == 27)

            break;

        //销毁窗口

        cvWaitKey(0);

        cvDestroyWindow("Source Image");

        cvDestroyWindow("Canny Image");

        cvDestroyWindow("Gray Image");

        cvDestroyWindow("Binary Image");
       
        //释放图像

        cvReleaseImage(&g_pGrayImage);

        cvReleaseImage(&g_pCannyImg);

        cvReleaseImage(&g_pSrcImg);

        cvReleaseImage(&g_pBinaryImage);
       
        return 0;

    }
   
    return -1;

}

//-----------------------------【ContrastAndBright( )函数】------------------------------------
//    描述:改变图像对比度和亮度值的回调函数
//---------------------------------------------------------------------------------------------
static void ContrastAndBright(int)
{

    // 三个for循环,执行运算 dstImg(i,j) = a*srcImg(i,j) + b
    Mat srcImg, dstImg;
    srcImg = imread("lena.jpg");
    if (!srcImg.data)
    {
        printf("读取srcImg图片错误~! \n");
        return ;
    }
    dstImg = Mat::zeros(srcImg.size(), srcImg.type());

    for (int y = 0; y < srcImg.rows; y++)
    {
        for (int x = 0; x <srcImg.cols; x++)
        {
            for (int c = 0; c < 3; c++)
            {
                dstImg.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_nContrastValue*0.01)*(srcImg.at<Vec3b>(y, x)[c]) + g_nBrightValue);
            }
        }
    }

    // 显示图像
    imshow("ContrastandBrightnessWnd", dstImg);
}

//-----------------------------------【ShowHelpText( )函数】----------------------------------
//         描述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
void ShowHelpText()
{

    printf("\n\n\t\t\t                运行平台为win32 VS2013\n");
    printf("\n\n\t\t\t                OpenCV一个值得你学习的强大视觉库\n");
    printf("\n\n\t\t\t                当前使用的OpenCV版本为:" CV_VERSION);
    printf("\n\n  ------------------------------------------------------------------------------------------------------------------\n");
}

程序运行结果

                                                             

                                        

                                         

                                                                  

  作者目前还是个小菜鸟,如有错误,请指出来,相互交流一下,(●‘?‘●)。

 

 

时间: 2024-08-26 15:52:20

OpenCV图像处理的相关文章

从零开始的Opencv图像处理项目实战课程设计

一.简介.1.通过课程能够获得什么?     a.对于想学习图像处理的同学能够快速入门:     b.能够快速搭建起来"具备解决实际问题能力的"软硬件平台:     c.能够积累一套可以不断复用的图像处理软件框架:     d.初步形成图像处理的思维能力,灵活应对各种需求.2.课程包括哪些内容     a.综述.课程的核心是开发一个基于Opencv的"答题卡"识别系统.不仅包括算法,而且包括软件框架,而且包括硬件选配.     b.opencv图像处理的环境配置.运

《OpenCV图像处理编程实例》 目录

当当网购买地址:http://product.dangdang.com/23956649.html京东网购买地址:http://item.jd.com/11929148.html 内容简介 本书以 OpenCV 开源库为基础实现图像处理领域的很多通用算法,并结合当今图像处理领域前沿技术,对多个典型工程实例进行讲解及实现.全书内容覆盖面广,由基础到进阶,各个技术点均提供详细的代码实现,以帮助读者快速上手和深入学习.本书内容共三个部分,其中 1-2 章为基础篇, 3-6 章为进阶篇, 7-9 章为高

OpenCV &mdash;&mdash; 图像处理

使用图像结构中所定义的高层处理方法(图形和视觉范畴)来完成特定任务 平滑处理   cvSmooth 处理后图像与输入图像的大小相同(不用考虑边缘) 中值滤波  CV_MEDIAN 不支持 in place 操作 , 高斯滤波 CV_GAUSSIAN 支持 in place 操作(可以设置高斯核不对称,双边滤波--高斯平滑,水彩画处理,可用于图像分割) 图像形态学 膨胀 -- 把二值图像各像素连接成分的边界扩大一层,填充边缘或像素内部的孔:使灰度图像高亮区域逐渐增长 腐蚀 -- 把二值图像各像素连

《OpenCV图像处理编程实例》

<OpenCV图像处理编程实例>例程复现 随书代码下载:http://www.broadview.com.cn/28573 总结+遇到的issue解决: 第一章 1.VS2015安装OpenCV2.4.11 四步骤: 1)步骤一:下载Windows安装包OpenCV2.4.11并解压,本人为:D:\ProgramFiles\opencv2 2)步骤二:配置OpenCV2.4.11的环境变量,本人为:D:\ProgramFiles\opencv2\opencv\build\x86\vc12\bi

OpenCV图像处理篇之腐蚀与膨胀

转载请注明出处:http://xiahouzuoxin.github.io/notes 腐蚀与膨胀 腐蚀和膨胀是图像的形态学处理中最基本的操作,之后遇见的开操作和闭操作都是腐蚀和膨胀操作的结合运算.腐蚀和膨胀的应用非常广泛,而且效果还很好: 腐蚀可以分割(isolate)独立的图像元素,膨胀用于连接(join)相邻的元素,这也是腐蚀和膨胀后图像最直观的展现 去噪:通过低尺寸结构元素的腐蚀操作很容易去掉分散的椒盐噪声点 图像轮廓提取:腐蚀操作 图像分割 等等...(在文后给出一则简单实用膨胀操作提

三 OpenCV 图像处理-1

1.颜色空间转换 内容:颜色空间转换(BGR<->Gray.BGR<->HSV)/获取图形中特定颜色的物体/ 函数:cv2.cvtColor(input_img,flag):flag:转换类型:cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2HSV等有261多种 import cv2 as cv import numpy as np #打印出所有的转换类型 flags = [item for item in dir(cv) if 'COLOR_' in item]

基于Opencv图像处理的时时头像採集试验

2014 4.20 近期想做一个关于图像处理的软件玩玩,可惜也没有什么特别的想法,就当玩玩好了,准备用Opencv开源库实现下简单的功能吧. Opencv是一个专业的图像处理库,里面有非常多基础函数能够实现非常多非常多功能,明天開始动工吧,真是兴致来了挡也档不住,思考一晚上! 2014 4.21 本来想用Vs2010做下,发现配置有点麻烦,还是选择Vc6干吧,选用的库为 Opencv1.0. 配置Visual C++ 6.0 全局设置 菜单Tools->Options->Directories

Python+OpenCV图像处理(一)——读取显示一张图片

配置好所有环境后,开始利用python+opencv进行图像处理第一步. 读取和显示一张图片: import cv2 as cv src=cv.imread('E:\imageload\example.png') cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) cv.imshow('input_image', src) cv.waitKey(0) cv.destroyAllWindows() 输出效果: 代码解释: src=cv.imread(

Python+OpenCV图像处理(十四)—— 直线检测

简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).最基本的霍夫变换是从黑白图像中检测直线(线段). 2.Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等) 3.霍夫线变

python+opencv图像处理(一)

一.什么是opencv?  Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持.OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.MacOS操作系统上.它轻量级而且高效--由一系列 C 函数和少量C++类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法.最新版本是3.1 ,201