当前位置:   article > 正文

OpenCV-图像对比度增强(美白)_ffmpeg opencv 美白

ffmpeg opencv 美白

原理:
假设输入图像为A,输出图像为B,图像的线性变换提高对比度的公式可以定义为:
B(r,c)=aA(r,c)+b*
其中r,c是图像的像素坐标点,a为变换系数,b为初始添加值

C++:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
	Mat img,dst;
	//加载图像
	img=imread("D:/woman.jpg");
	if (img.empty())
	{
		cout << "输入图像错误" << endl;
		return -1;
	};
	imshow("original image", img);
	
	//获取图像宽和高
	int height = img.rows;
	int width = img.cols;
	//初始化空白图像
	dst.create(img.size(), img.type());
	//像素范围在0~255中越来越亮
	int original_pixel = 30;		//像素提高的数值
	double original_alpha = 1.3;	//像素提高的比例系数
	for (int i=0;i<height;i++) 
	{
		for (int j = 0; j < width; j++)
		{
			int B = img.at<Vec3b>(i, j)[0];
			int G = img.at<Vec3b>(i, j)[1];
			int R = img.at<Vec3b>(i, j)[2];
			//saturate_cast函数保证输入的像素值控制在0~255,从而不会越界
			dst.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(B*original_alpha + original_pixel);
			dst.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(G*original_alpha + original_pixel);
			dst.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(R*original_alpha + original_pixel);
		};
	};

	imshow("enhanced image",dst);
	waitKey(0);
	return 0;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

Python:

import cv2 as cv
import numpy as np

##读取图像
img = cv.imread('D:/woman.jpg')
cv.imshow("original image",img)
##读取图像高宽和通道数
height,width,channel=img.shape
##初始化空白图像和系数
enhanced_image=np.zeros(img.shape,dtype=np.float64)
#    float类型是因为后面系数是含有小数点;假如某一像素值是180,在uint8类型(整型)下,转化为180*1.5+30=300
#    300%256=44(转化后的像素值);所以应该在float64类型下。
original_pixel=30
original_alpha=1.5
#方法一(直接用矩阵去运算)
#enhanced_image=img*original_alpha+original_pixel

#方法二(通过访问像素运算)
for r in range(height):
    for c in range(width):
        B = img[r, c][0]
        G = img[r, c][1]
        R = img[r, c][2]
        enhanced_image[r ,c][0] = B * original_alpha + original_pixel
        enhanced_image[r, c][1] = G * original_alpha + original_pixel
        enhanced_image[r, c][2] = R * original_alpha + original_pixel


enhanced_image[enhanced_image>255]=255  #对大于255的值截断为255
enhanced_image=np.round(enhanced_image) #取整
enhanced_image=enhanced_image.astype(np.uint8)  #最后转化为0~255之间


cv.imshow("enhanced image",enhanced_image)
cv.waitKey(0)
cv.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

结果显示:
中间的为正常图

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号