2016-10-16 13:11:12 songyimin1208 阅读数 9993
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    20063 人正在学习 去看看 夏曹俊

转载来自:http://blog.sina.com.cn/s/blog_67d185b80101ferj.html


在图像处理中经常遇到需要提高图像亮度或者曝光度的时候,所以我实验了一种比较有效的算法,算法很简单:


I表示要处理的较暗图像,T表示处理后的比较亮的图像
T(x)=I(x)+(1-I(x))*I(x)

算法思想就是通过非线性叠加,增加图像亮度。跟photoshop里的滤色算法差不多。

matlab 代码表示如下:

T=I+(1-I).*I;

T和I都是[0,1]取值的图像。如果一次效果不好算法可以多次迭代。

当然可以在代码中加入一个控制参数K取值[0,1],可以控制亮度的增加强度。
T=I+(1-I).*I.*K;


2017-05-07 17:13:49 u013085897 阅读数 7785
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    20063 人正在学习 去看看 夏曹俊

       图像处理中,图像亮度调节可能是最简单的算法了,非常常见的线性运算即可完成亮度调节,比如所有像素点亮度值乘或者加一个增强系数,使得图像整体变亮或者变暗。看过一些相关开源代码,常见的操作是乘以一个亮度调节系数。但是,这样做很容易使图像出现过饱和现象,即亮度值超出255。photoshop中是如何实现的不得而知,每个版本可能也不一样。还是说说我的实现方法,其实就是在调节过程中,根据像素点亮度,做非线性调节,即高光、阴影部分调节小一点,中间部分多调节一些,这样亮度调节看着更自然一些。下面是示例代码:

void ImageBrightness(BMPINFO *pSrcBitmap, float strength)
{
	int brightness = (int)(strength*100);
	uchar lookupTable[256];
	for (int i = 0; i < 256; i++)
	{
		lookupTable[i] = (uchar)MIN(255, MAX(0, i + sin(FILTER_PI*i / 255.0f)*brightness));
	}

	int size = pSrcBitmap->lWidth*pSrcBitmap->lHeight;
	uchar* pSrcData = pSrcBitmap->pPlane[0];
	for (int i = 0; i < size; i++, pSrcData+=4)
	{
		pSrcData[AXJ_BLUE] = lookupTable[pSrcData[AXJ_BLUE]];
		pSrcData[AXJ_GREEN] = lookupTable[pSrcData[AXJ_GREEN]];
		pSrcData[AXJ_RED] = lookupTable[pSrcData[AXJ_RED]];
	}
}

       亮度调节示例图片,上面为原图,下面为结果图。

              

              




2017-07-19 17:32:33 llh_1178 阅读数 7658
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    20063 人正在学习 去看看 夏曹俊

处理图像经常会对图像色彩进行增强,这就是改变图像的亮度和对比度。本章基于opencv对图像的亮度和对比度进行处理操作。其实,这是对图像的每一个像素点进行相应的操作。


上面这个公式可以很好的解释对图像的亮度和对比度操作的原理,第一个参数α必须是大于零,不然则基本上没有意义了。α能代表什么呢?α能使图像像素成倍数的增长或降低(α<1),改变了是图像的对比度,因为使图像的差值变化了。那么β作何解释呢?β可为负,也可为正,那么任何一个像素都在(0, 255)之间,加上一个值或减去一个值则会使这个像素点变大或变小,其实就是向白色或向黑色靠近(0为黑,255为白),所以改变的是图像的亮度。

接下来我们用代码演示:

(一)基于Python语言——演示灰色图像的比色度和反差

import cv2
import matplotlib.pyplot as plt
# 反差与对比度
input_image = cv2.imread("Peppers.jpg")
output_gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
output_min_gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
output_max_gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
# 反差图像,cv2.bitwise_not()函数相当于用255减去每一个像素。
output_contrast_image = cv2.bitwise_not(input_image)
for i in xrange(input_image.shape[0]):
    for j in xrange(input_image.shape[1]):
        b = input_image[i, j, 0]
        g = input_image[i, j, 1]
        r = input_image[i, j, 2]
        output_min_gray[i, j] = min(b, min(g, r))
        output_max_gray[i, j] = max(b, min(g, r))

output_image = [output_gray, output_min_gray, output_max_gray, output_contrast_image]
output_titles = ["output_gray", "output_min_gray", "output_max_gray", "output_contrast_image"]
for i in xrange(4):
    plt.subplot(2, 2, (i+1))
    plt.imshow(output_image[i], "gray")
    plt.title(output_titles[i])
    plt.xticks([]), plt.yticks([])
plt.savefig("contrast_gray")


(二)基于C++语言——演示图像的亮度

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char* argv) {
	Mat src, dst;
	src = imread("test.jpg");
	if (src.empty()) {
		printf("Could not load image...\n");
		return -1;
	}
	char input_win[] = "input image";
	namedWindow(input_win, CV_WINDOW_AUTOSIZE);
	imshow("input window", src);

	int height = src.rows;
	int width = src.cols;
	dst = Mat::zeros(src.size(), src.type());
        float alpha = 0.8;
	float beta = -20;
	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			
			float b = src.at<Vec3b>(row, col)[0];
			float g = src.at<Vec3b>(row, col)[1];
			float r = src.at<Vec3b>(row, col)[2];
			// saturate_cast 函数确保像素值在0到255之间。
			dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
			dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
			dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
			
		}
	}
	char output_title[] = "contrast and brightness change demo";
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);
	imshow(output_title, dst);
	
	waitKey(0);
	return 0;
}




2020-02-10 21:18:48 Trent1985 阅读数 561
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    20063 人正在学习 去看看 夏曹俊

        本文将介绍数字图像处理中两个基本内容---图像亮度对比度,详细讲解两种基本的亮度对比度调节算法,并使用C语言进行算法实现,在教会初学者算法的同时,不依赖任何第三方库编程实现,学以致用且易学易用。

        图像亮度、对比度和饱和度是图像处理中三个基本概念,本片将着重介绍一下亮度和对比度。

        图象亮度是指画面的明亮程度,单位是堪德拉每平米(cd/m2)或称nits,对于一副灰度图而言,灰度值越高,图像就越亮,反之,图像越暗;

        如图Fig.1所示,图像亮度由左向右一次增加,图像视觉感受依次变亮。

        图像对比度是指一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即一幅图像灰度反差的大小或者图片上亮区域和暗区域的层次感

        如图Fig.2所示,图像的对比度由左向右依次增强,灰度级反差依次增强;

[定义与算法]

        图像亮度对比度调节算法有很多,累计的研究论文也是数不胜数,本文从初学者的角度,来介绍两种较为简单、实用的算法。在介绍算法之前,我们首先假设输入图像像素为P(x),输出结果像素为D(x)。

        算法一:线性亮度对比度调节算法,公式如下:

        其中,k为大于0的数,用于调节对比度,当0<k<1时对比度减小,当k=1时,保持原始对比度,当k>1时,对比度增强;l用于调节图像亮度,范围为[-255,255];

        为了方便调节参数,我们将k和l进行了一定的限制和修正,公式如下:

        这个公式允许我们调节亮度(bright)和对比度(contrast)的范围都是[-100,100],在实际中,更加便于理解和调节。我们用这个算法公式进行效果测试,如下图Fig.3所示。

        上述算法一是一个最简单的线性亮度对比度调节算法,当然,也存在一些问题,比如,在调节对比度的同时,亮度也发生了较大变化等。

        算法二:Photoshop旧版亮度对比度调节算法,公式如下:

        这个算法是Photoshop中的经典算法,Photoshop经历了N次版本更新,但是,这个亮度对比度调节算法依旧保留至今。算法详细过程如下:

        ①亮度调节算法使用的是最简单的线性调节,即:

        ②算法首先根据对比度contrast进行判断,对比度大于0,则先进行亮度调节,反之,先进行对比度调节;

        ③当对比度参数contrast>0时,进行如下对比度调节:

        此处如果contrast=100,则做如下变换;

        ④当对比度参数contrast<=0时,进行如下对比度调节:

        此处如果contrast=-100,则D(x)=0;

        在整个算法中,采用了一个默认阈值threshold=127.5,在contrast=-100时,对比度效果表现为中性灰颜色,我们测试这个算法,并与Photoshop进行效果对比,如图Fig.4所示。

        通过图Fig.4的对比,我们发现,本文算法与Photoshop的旧版亮度对比度调节算法效果基本一致。

[绘制与代码]

        我们用C语言来实现图像亮度对比度算法,定义如下接口:

/*********************************************************
*Function:图像亮度对比度算法一
*Params:
*          srcData:32bgra图像数据
*          width:图像宽度
*          height:图像高度
*          stride:图像幅度,对于32bgra格式而言,stride=width*4
*          brightness: 亮度值,范围[-100,100]
*          contrast: 对比度值,范围[-100,100]
*Return:  0-成功,其他失败
*********************************************************/
int f_BrightContrastLineartransform(unsigned char* srcData, int width, int height, int stride, int brightness, int contrast);
/*********************************************************
*Function:图像亮度对比度算法二
*Params:
*          srcData:32bgra图像数据
*          width:图像宽度
*          height:图像高度
*          stride:图像幅度,对于32bgra格式而言,stride=width*4
*          brightness: 亮度值,范围[-100,100]
*          contrast: 对比度值,范围[-100,100]
*Return:  0-成功,其他失败
*********************************************************/
int f_BrightContrastPS(unsigned char* srcData, int width, int height, int stride, int brightness, int contrast);

        在该接口中,我们统一使用bgra32位数据格式,设置亮度brightness和对比度contrast两个调节参数,分别实现算法一和算法二两种算法,实现代码如下:

#include"f_Colortransform.h"
/*********************************************************
*Function:明度法灰度化
*Params:
*          srcData:32bgra图像数据
*          width:图像宽度
*          height:图像高度
*          stride:图像幅度,对于32bgra格式而言,stride=width*4
*          brightness: 亮度值,范围[-100,100]
*          contrast: 对比度值,范围[-100,100]
*Return:  0-成功,其他失败
*********************************************************/
int f_BrightContrastLineartransform(unsigned char* srcData, int width, int height, int stride, int brightness, int contrast)
{
	int ret = 0;
	unsigned char* pSrc = srcData;
	for(int j = 0; j < height; j++)
	{
		for(int i = 0; i < width; i++)
		{
			//pSrc[0]---Blue色蓝通道,pSrc[1]---Green色绿通道,pSrc[2]---Red红色通道
			pSrc[0] = CLIP3((contrast + 100) * pSrc[0] / 100 + brightness, 0, 255);
			pSrc[1] = CLIP3((contrast + 100) * pSrc[1] / 100 + brightness, 0, 255);
			pSrc[2] = CLIP3((contrast + 100) * pSrc[2] / 100 + brightness, 0, 255);
			//32位bgra格式,每个像素有4个字节表示,所以内存中每次偏移4表示一个像素
			pSrc += 4;
		}
	}
	return ret;
};
/*********************************************************
*Function:图像亮度对比度算法二
*Params:
*          srcData:32bgra图像数据
*          width:图像宽度
*          height:图像高度
*          stride:图像幅度,对于32bgra格式而言,stride=width*4
*          brightness: 亮度值,范围[-100,100]
*          contrast: 对比度值,范围[-100,100]
*Return:  0-成功,其他失败
*********************************************************/
int f_BrightContrastPS(unsigned char* srcData, int width, int height, int stride, int brightness, int contrast)
{
	int ret = 0;
	unsigned char* pSrc = srcData;
	float threshold = 127.5;
	unsigned char LUT_BC[256] = {0};
	int temp = 0;
	for (int i = 0; i < 256; i++)
	{
		if (contrast > 0)
		{ 
			temp = CLIP3(i + brightness, 0, 255);
			if (contrast < 100)
				temp = CLIP3(threshold + (temp - threshold) * (1.0f / (1.0f - contrast / 100.0f)), 0, 255);
			else
				temp = temp > threshold ? 255 : 0;
		}
		else
		{ 
			temp = i; 
			temp = CLIP3(threshold + (temp - threshold) * (1.0f + contrast / 100.0f), 0, 255);
			temp = CLIP3(temp + brightness, 0, 255);
		} 
		LUT_BC[i] = temp;
	}
	for (int j = 0; j < height; j++)
	{
		for (int i = 0; i < width; i++)
		{
			//pSrc[0]---Blue色蓝通道,pSrc[1]---Green色绿通道,pSrc[2]---Red红色通道
			pSrc[0] = LUT_BC[pSrc[0]];
			pSrc[1] = LUT_BC[pSrc[1]];
			pSrc[2] = LUT_BC[pSrc[2]];
			//32位bgra格式,每个像素有4个字节表示,所以内存中每次偏移4表示一个像素
			pSrc += 4;
		}
	}
	return ret;
};

        整个代码非常简单,没有使用复杂的C语言代码,方便初学者学习,最后,我们给出对应的调用代码:

// Trent_ImageRWDemo.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include"imgRW\f_SF_ImgBase_RW.h"
#include"f_Colortransform.h"

int _tmain(int argc, _TCHAR* argv[])
{
	//定义输入图像路径
	char* inputImgPath = "Test.png";
	//定义输出图像路径
	char* outputImgPath_bc = "res_bc.jpg";
	
	//定义图像宽高信息
	int width = 0, height = 0, component = 0, stride = 0;
	//图像读取(得到32位bgra格式图像数据)
	unsigned char* bgraData = Trent_ImgBase_ImageLoad(inputImgPath, &width, &height, &component);
	stride = width * 4;
	//其他图像处理操作(这里以32位彩色图像灰度化为例)
	//////////////////////////IMAGE PROCESS/////////////////////////////
	////彩色图像线性亮度对比度调节
	int brightness = -30;
	int contrast = 100;
	int ret = 0;
	//算法一
	//ret = f_BrightContrastLineartransform(bgraData, width, height, stride, brightness, contrast);
	//算法二Photoshop旧版亮度对比度调节
	ret = f_BrightContrastPS(bgraData, width, height, stride, brightness, contrast);
	ret = Trent_ImgBase_ImageSave(outputImgPath_bc, width, height, bgraData, JPG);
	printf("Done!");
	////////////////////////////////////////////////////////////////////
	free(bgraData);
	return 0;
}

[知识扩展]

        亮度对比度作为图像处理的基本内容,本文所讲述的都是带参数的调节算法,实际应用中,它的研究重点在于如何自动对一张图像进行亮度对比度调节,而不是人工输入参数进行调节,如下图Fig.5所示,上面一组位原图,光线和对比度都因暗光拍摄环境而有所影响,下面一组图为自动亮度对比度调节算法的效果图,可以看到,亮度和内容的对比度层次感明显提升。

        目前,亮度对比度自动调节算法主要可以分为传统算法和深度学习算法两大类。传统算法主要包括颜色直方图裁剪、直方图均衡化、Retinex增强以及局部均方差信息和曲线拟合等方法,对应论文举例如下:

《Real-Time Adaptive Contrast Enhancement》

《Multiscale Retinex》

《A Novel Automatic White Balance Method For Digital Still Cameras》

《Automatic Exposure Correction of Consumer Photographs》

        深度学习算法往往基于卷积神经网络、GAN网络等,构造各种亮度对比度参数调节模型或者端到端模型,其中效果最佳的一篇论文,个人认为当属腾讯2019年发表的一篇论文,效果惊艳,而且GPU可以实时处理,大家有兴趣可以自行研究,论文及对应代码如下:

《Underexposed Photo Enhancement using Deep Illumination Estimation》

论文的测试DEMO github地址:https://github.com/wangruixing/DeepUPE

        本文到此就讲完了,主要给大家讲述了两种基础的图像亮度对比度调节算法,并给出了完整的C语言实现代码,手把手教会大家单纯用C语言来学图像算法,就这么简单!

        本节完整的代码工程关注本人公众号“SF图像算法”有相关下载链接即可免费下载。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2019-03-30 19:46:28 jameschen9051 阅读数 486
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    20063 人正在学习 去看看 夏曹俊

首先,图像处理基本操作为亮度,对比度,饱和度调整。亮度操作最为简单。计算机三原色R(0~255)G(0~255)B(0~255),一个像素的色彩就是由RGB值组合渲染而成。因此,一些基本的图像处理就是对像素上RGB值进行操作。

个人简单研究了下使用Java处理JPG格式图像,这里简单记录下使用Java对图像进行亮度调整。第一步,读取图片,使用ImageIO.read()读取图片,返回一个BufferedImage对象;

BufferedImage image = ImageIO.read(file);

第二步,先从image中取出每一个像素值rgb,再从rgb上取出R,G,B每个分量,分别进行操作后重新装入rgb(注意:由于RGB值为0~255之间,操作过程中可能出现数值超限,需要通过一个clamp方法判断,大于255则返回255,小于0则返回0);

int rgb,R,G,B;
for (int i = 0; i < bImage.getWidth(); i++) {
	for (int j = 0; j < bImage.getHeight(); j++) {
		rgb = bImage.getRGB(i, j);
		R = ((rgb >> 16) & 0xff)+ param;
		G = ((rgb >> 8) & 0xff) + param;
		B = (rgb & 0xff) + param;
		rgb = (255 & 0xff) << 24) | ((clamp(R) & 0xff) << 16) | ((clamp(G) & 0xff) << 8) | ((clamp(B) & 0xff));
		bImage.setRGB(i, j, rgb);
	}
}

判断RGB值是否超限的clamp方法如下:

private int clamp(int rgb) {
		if (rgb > 255)
			return 255;
		if (rgb < 0)
			return 0;
		return rgb;
	}

第三步,通过ImageIO.write()方法把处理后的image保存到新文件;

ImageIO.write(image,"JPG",file);

完整的DEMO如下:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class LumAdjust {
	/**
	 * 图片亮度调整
	 * @param image
	 * @param param
	 * @throws IOException
	 */
	public void lumAdjustment(BufferedImage image, int param) throws IOException {
		if (image == null) {
			return;
		} else {
			int rgb, R, G, B;
			for (int i = 0; i < image.getWidth(); i++) {
				for (int j = 0; j < image.getHeight(); j++) {
					rgb = image.getRGB(i, j);
					R = ((rgb >> 16) & 0xff) + param;
					G = ((rgb >> 8) & 0xff) + param;
					B = (rgb & 0xff) + param;

					rgb = ((clamp(255) & 0xff) << 24) | ((clamp(R) & 0xff) << 16) | ((clamp(G) & 0xff) << 8)
							| ((clamp(B) & 0xff));
					image.setRGB(i, j, rgb);
				}
			}
		}
	}

	// 判断a,r,g,b值,大于256返回256,小于0则返回0,0到256之间则直接返回原始值
	private int clamp(int rgb) {
		if (rgb > 255)
			return 255;
		if (rgb < 0)
			return 0;
		return rgb;
	}
	
	public static void main(String[] args) throws IOException {
		File file = new File("E:/桌面/test/1.JPG");
		BufferedImage image = ImageIO.read(file);
		LumAdjust lumAdjust = new LumAdjust();
		lumAdjust.lumAdjustment(image, 30);
		File file2 = new File("E:/桌面/test/2.JPG");
		file2.createNewFile();
		ImageIO.write(image, "JPG", file2);
}
}

​

原图:

亮度增加30后效果:

需要注意的是,ImageIO.read()只读取了JPG图片的色彩信息,即aRGB数据,a(0~255)为透明通道,因此BufferedImage对象中不包含原始JPG图像其他属性信息,如相机型号,品牌,拍摄时间,GPS位置信息等,因此处理后图像会丢失部分信息,保存路径不建议覆盖原图。如果需要保留图片属性要通过ImageIO下其他方式读取。

图像亮度处理

阅读数 7443

没有更多推荐了,返回首页