opencv如何实现光照补偿

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv如何实现光照补偿相关的知识,希望对你有一定的参考价值。

参考技术A 光照补偿,整体调节灰度值就可以,可以用cvNormalize;
参考实例如下:
#include <cv.h>

#include <highgui.h>
#include <stdio.h>
#include <string>
using namespace std;
void main()

int i;
IplImage *pImageChannel[4] = 0,0,0,0;
int count = 15;
char *name = new char;
while(count<=17)

string FileName = "S010_001_015942";
itoa(count,name,10);
FileName = FileName + name;
FileName = FileName + string(".png");
IplImage *pSrcImage = cvLoadImage(FileName.c_str());
IplImage *pImage = cvCreateImage(cvGetSize(pSrcImage), pSrcImage->depth, pSrcImage->nChannels);
if(pSrcImage)

for( i=0; i<pSrcImage->nChannels; i++)

pImageChannel[i] = cvCreateImage( cvGetSize(pSrcImage), pSrcImage->depth, 1);

// 信道分离
cvSplit( pSrcImage, pImageChannel[0], pImageChannel[1],pImageChannel[2],NULL);
for( i = 0; i < pImage->nChannels; i++ )

//直方图均衡化
cvEqualizeHist(pImageChannel[i], pImageChannel[i]);

// 信道组合
cvMerge( pImageChannel[0], pImageChannel[1], pImageChannel[2],NULL,pImage);
// ……图像显示代码(略)
// 释放资源
for( i=0; i<pSrcImage->nChannels; i++)

if(pImageChannel[i])

cvReleaseImage( &pImageChannel[i] );
pImageChannel[i] = 0;


cvNamedWindow("1");
cvShowImage("1",pImage);
cvWaitKey();
cvDestroyWindow("1");
//
string saveFile = ".\\002\\histgram\\";
saveFile = saveFile + name;
saveFile = saveFile + ".bmp";
cvSaveImage(saveFile.c_str(),pImage);
count++;
cvReleaseImage( &pImage );


参考技术B 求亮度,直方图均衡化追问

是不是同人脸肤色的光照补偿那个算法差不多来求前5%的像素亮度,然后再直方图均衡化?

追答

基本意思差不多,可能会根据你具体要处理的图片调整

追问

能不能给出个代码描述一下?

如何使用 Homography 在 OpenCV 中转换图片?

【中文标题】如何使用 Homography 在 OpenCV 中转换图片?【英文标题】:HOW TO use Homography to transform pictures in OpenCV? 【发布时间】:2012-11-14 05:48:42 【问题描述】:

我有两张图片(A 和 B),一张与另一张略有失真,它们之间存在平移、旋转和比例差异(例如,这些图片:)


Ssoooooooo 我需要在图片 B 中应用一种转换,以补偿存在的失真/平移/旋转,以使两张图片具有相同的大小、方向且没有平移

我已经提取了点并找到了 Homography,如下所示。但是我不知道如何使用 Homography 来转换 Mat img_B 所以它看起来像 Mat img_A。有什么想法吗?

//-- Localize the object from img_1 in img_2
std::vector<Point2f> obj;
std::vector<Point2f> scene;

for (unsigned int i = 0; i < good_matches.size(); i++) 
    //-- Get the keypoints from the good matches
    obj.push_back(keypoints_object[good_matches[i].queryIdx].pt);
    scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt);


Mat H = findHomography(obj, scene, CV_RANSAC);

干杯,

【问题讨论】:

【参考方案1】:

您需要warpPerspective 函数。该过程类似于this 教程中介绍的过程(用于仿射变换和扭曲)

【讨论】:

【参考方案2】:

这个问题不需要单应性。您可以改为计算仿射变换。但是,如果您确实想将单应性用于其他目的,您可以查看下面的代码。它是从this 复制的homography 上的详细文章。

C++ 示例

// pts_src and pts_dst are vectors of points in source 
// and destination images. They are of type vector<Point2f>. 
// We need at least 4 corresponding points. 

Mat h = findHomography(pts_src, pts_dst);

// The calculated homography can be used to warp 
// the source image to destination. im_src and im_dst are
// of type Mat. Size is the size (width,height) of im_dst. 

warpPerspective(im_src, im_dst, h, size);

Python 示例

'''
pts_src and pts_dst are numpy arrays of points
in source and destination images. We need at least 
4 corresponding points. 
''' 
h, status = cv2.findHomography(pts_src, pts_dst)

''' 
The calculated homography can be used to warp 
the source image to destination. Size is the 
size (width,height) of im_dst
'''

im_dst = cv2.warpPerspective(im_src, h, size)

【讨论】:

以上是关于opencv如何实现光照补偿的主要内容,如果未能解决你的问题,请参考以下文章

[转帖]如何选择分布式事务形态(FescarTCCSAGA补偿基于消息的最终一致

youcans 的 OpenCV 例程200篇140. 灰度底帽变换校正光照

OpenCV中直方图反向投影算法详解与实现

opencv 如何去除最外边框

如何选择分布式事务形态

Opengl场景中加光照包含几个步骤,各个步骤实现用的函数是啥?