python opencv图像对比度增强_用python(cv2)中的OpenCV增加彩色图像对比度的最快方法是什么?...

I'm using OpenCV to process some images, and one of the first steps I need to perform is increasing the image contrast on a color image. The fastest method I've found so far uses this code (where np is the numpy import) to multiply and add as suggested in the original C-based cv1 docs:

if (self.array_alpha is None):

self.array_alpha = np.array([1.25])

self.array_beta = np.array([-100.0])

# add a beta value to every pixel

cv2.add(new_img, self.array_beta, new_img)

# multiply every pixel value by alpha

cv2.multiply(new_img, self.array_alpha, new_img)

Is there a faster way to do this in Python? I've tried using numpy's scalar multiply instead, but the performance is actually worse. I also tried using cv2.convertScaleAbs (the OpenCV docs suggested using convertTo, but cv2 seems to lack an interface to this function) but again the performance was worse in testing.

解决方案

Simple arithmetic in numpy arrays is the fastest, as Abid Rahaman K commented.

Here is a bit of image processing that resembles brightness/contrast manipulation:

'''

Simple and fast image transforms to mimic:

- brightness

- contrast

- erosion

- dilation

'''

import cv2

from pylab import array, plot, show, axis, arange, figure, uint8

# Image data

image = cv2.imread('imgur.png',0) # load as 1-channel 8bit grayscale

cv2.imshow('image',image)

maxIntensity = 255.0 # depends on dtype of image data

x = arange(maxIntensity)

# Parameters for manipulating image data

phi = 1

theta = 1

# Increase intensity such that

# dark pixels become much brighter,

# bright pixels become slightly bright

newImage0 = (maxIntensity/phi)*(image/(maxIntensity/theta))**0.5

newImage0 = array(newImage0,dtype=uint8)

cv2.imshow('newImage0',newImage0)

cv2.imwrite('newImage0.jpg',newImage0)

y = (maxIntensity/phi)*(x/(maxIntensity/theta))**0.5

# Decrease intensity such that

# dark pixels become much darker,

# bright pixels become slightly dark

newImage1 = (maxIntensity/phi)*(image/(maxIntensity/theta))**2

newImage1 = array(newImage1,dtype=uint8)

cv2.imshow('newImage1',newImage1)

z = (maxIntensity/phi)*(x/(maxIntensity/theta))**2

# Plot the figures

figure()

plot(x,y,'r-') # Increased brightness

plot(x,x,'k:') # Original image

plot(x,z, 'b-') # Decreased brightness

#axis('off')

axis('tight')

show()

# Close figure window and click on other window

# Then press any keyboard key to close all windows

closeWindow = -1

while closeWindow<0:

closeWindow = cv2.waitKey(1)

cv2.destroyAllWindows()

Original image in grayscale:

Brightened image that appears to be dilated:

Darkened image that appears to be eroded, sharpened, with better contrast:

How the pixel intensities are being transformed:

If you play with the values of phi and theta you can get really interesting outcomes. You can also implement this trick for multichannel image data.

--- EDIT ---

have a look at the concepts of 'levels' and 'curves' on this youtube video showing image editing in photoshop. The equation for linear transform creates the same amount i.e. 'level' of change on every pixel. If you write an equation which can discriminate between types of pixel (e.g. those which are already of a certain value) then you can change the pixels based on the 'curve' described by that equation.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值