Повышение контрастности изображения python

How do I adjust brightness, contrast and vibrance with opencv python?

For 4, 5, 6. I am using the following code to convert to HSV space.

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) h, s, v = cv2.split(hsv) h += value # 4 s += value # 5 v += value # 6 final_hsv = cv2.merge((h, s, v)) img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR) 

The only tutorial I found for 1 and 2 is here. The tutorial uses C++, but I program in Python. Also, I do not know how to adjust 3. vibrance. I would very much appreciate the help, thanks!.

4 Answers 4

Thanks to @MarkSetchell for providing the link. In short, the answers uses numpy only and the formula can be presented as in below.

new_image = (old_image) × (contrast/127 + 1) — contrast + brightness

Here contrast and brightness are integers in the range [-127,127]. The scalar 127 is used for this range. Also, below is the code I used.

brightness = 50 contrast = 30 img = np.int16(img) img = img * (contrast/127+1) - contrast + brightness img = np.clip(img, 0, 255) img = np.uint8(img) 

It’s worth pointing out that OpenCV has a built-in function convertScaleAbs) which will do all of the clipping for you. It will give abs(alpha*img + beta). In this case alpha=contrast/127+1. beta = brightness-contrast.

a simple way for brightness adjustment, proper for both color and monochrome images is

img = cv2.imread('your path',0) brt = 40 img[img < 255-brt] += brt cv2.imshow('img'+ img) 

where brt could be a positive number for increase brightness or a negative for darkness.

Читайте также:  Skillbox python full stack

The following links for a before and after of an image processed in this code, when the brt = 40 :

I am not sure if this would help, but for changing Brightness, Contrast I personally switch the image to PIL.Image and use PIL.ImageEnhance which comes in handy when using the ratios or percentages.

image = PIL.Image.open("path_to_image") #increasing the brightness 20% new_image = PIL.ImageEnhance.Brightness(image).enhance(1.2) #increasing the contrast 20% new_image = PIL.ImageEnhance.Contrast(image).enhance(1.2) 

I still have not found a clean way for Vibrance. For more on ImageEnahance, I'd suggest to read the official doc - https://pillow.readthedocs.io/en/stable/reference/ImageEnhance.html

For Conversion, I use this ..

NOTE - OpenCV uses BGR and PIL uses RGB channels. So, can get messy if not converted properly.

#convert pil.image to opencv (numpy.ndarray) #need numpy library for this cv_image = numpy.array(pil_image) #convert opencv to pil.image image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB) pil_image = Image.fromarray(image) 

Here is one way to do the vibrance in Python/OpenCV.

Convert to HSV. Then create a sigmoid function LUT.

(The sigmoid function increases linearly from the origin, but then tapers off to flat.)

enter image description here

Apply the LUT to S channel.

enter image description here

import cv2 import numpy as np # read image img = cv2.imread('yellow_building.jpg') # convert image to hsv colorspace as floats hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) h, s, v = cv2.split(hsv) print(np.amax(s), np.amin(s), s.dtype) # set vibrance vibrance=1.4 # create 256 element non-linear LUT for sigmoidal function # see https://en.wikipedia.org/wiki/Sigmoid_function xval = np.arange(0, 256) lut = (255*np.tanh(vibrance*xval/255)/np.tanh(1)+0.5).astype(np.uint8) # apply lut to saturation channel new_s = cv2.LUT(s,lut) # combine new_s with original h and v channels new_hsv = cv2.merge([h,new_s,v]) # convert back to BGR result = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2BGR) # save output image cv2.imwrite('yellow_building_vibrance.jpg', result) # display images cv2.imshow('result', result) cv2.waitKey(0) cv2.destroyAllWindows() 

Источник

Change contrast of image in PIL

I have a program that's supposed to change the contrast, but I feel like it's not really changing the contrast.It changes some areas to red whereas I don't want it to. If you could tell me how to remove them, thank you. Here is the code:

from PIL import Image def change_contrast(img, level): img = Image.open("C:\\Users\\omar\\Desktop\\Site\\Images\\obama.png") img.load() factor = (259 * (level+255)) / (255 * (259-level)) for x in range(img.size[0]): for y in range(img.size[1]): color = img.getpixel((x, y)) new_color = tuple(int(factor * (c-128) + 128) for c in color) img.putpixel((x, y), new_color) return img result = change_contrast('C:\\Users\\omar\\Desktop\\Site\\Images\\test_image1.jpg', 100) result.save('C:\\Users\\omar\\Desktop\\Site\\Images\\test_image1_output.jpg') print('done') 

And here is the image and its result: obama.png obama modified If this is the actual contrast method, feel free to tell me

I can't reproduce this. I tried your code and the output image is looks ok. i.stack.imgur.com/QhR3n.jpg

Your code contains two different attempts at loading an input image, though. You test_image1.jpg will not be used, since you have obama.png hard coded in the function body. Are you sure you are using the input file you think you are using?

2 Answers 2

I couldn't reproduce your bug. On my platform (debian) only the Pillow fork is available, so if you are using the older PIL package, that might be the cause.

In any case, there's a built in method Image.point() for doing this kind of operation. It will map over each pixel in each channel, which should be faster than doing three nested loops in python.

def change_contrast(img, level): factor = (259 * (level + 255)) / (255 * (259 - level)) def contrast(c): return 128 + factor * (c - 128) return img.point(contrast) change_contrast(Image.open('barry.png'), 100) 

output

Your output looks like you have a overflow in a single channel (red). I don't see any reason why that would happen. But if your level is higher than 259, the output is inverted. Something like that is probably the cause of the initial bug.

def change_contrast_multi(img, steps): width, height = img.size canvas = Image.new('RGB', (width * len(steps), height)) for n, level in enumerate(steps): img_filtered = change_contrast(img, level) canvas.paste(img_filtered, (width * n, 0)) return canvas change_contrast_multi(Image.open('barry.png'), [-100, 0, 100, 200, 300]) 

another output

A possible fix is to make sure the contrast filter only return values within the range 246, since the bug seems be caused by negative values overflowing somehow.

def change_contrast(img, level): factor = (259 * (level + 255)) / (255 * (259 - level)) def contrast(c): value = 128 + factor * (c - 128) return max(0, min(255, value)) return img.point(contrast) 

Источник

Регулировка контрастности, резкости и яркости изображения в Pillow Python

Контраст – это расстояние между цветами. Если увеличить контраст, цвета станут более яркими.

В этом уроке мы узнаем, как изменить контрастность изображения с помощью класса ImageEnhance библиотеки PIL.

Как настроить?

  • Прочтите изображение с помощью Image.open().
  • Создайте усилитель ImageEnhance.Contrast() для изображения.
  • Увеличьте контраст изображения с помощью методаhance() на требуемый коэффициент.

Регулируя коэффициент, вы можете регулировать контраст изображения.

В то время как коэффициент 1 дает исходное изображение. Установка коэффициента в сторону 0 делает изображение более серым, а коэффициент> 1 увеличивает контраст изображения.

Пример

В следующем примере мы изменим контраст изображения с коэффициентом 1, что дает исходное изображение. Затем с коэффициентом 1,5, что увеличивает контраст изображения. А затем с коэффициентом 0,5, что делает изображение серым.

from PIL import Image, ImageEnhance #read the image im = Image.open("sample-image.png") #image brightness enhancer enhancer = ImageEnhance.Contrast(im) factor = 1 #gives original image im_output = enhancer.enhance(factor) im_output.save('original-image.png') factor = 0.5 #decrease constrast im_output = enhancer.enhance(factor) im_output.save('less-contrast-image.png') factor = 1.5 #increase contrast im_output = enhancer.enhance(factor) im_output.save('more-contrast-image.png')

Регулировка контрастности изображения в Pillow Python

Изображение с увеличением контрастности:

Изображение с увеличением контрастности

Тусклое изображение – с пониженной контрастностью:

Тусклое изображение – с пониженной контрастностью

В этом руководстве на примерах Python мы узнали, как изменить контрастность изображения, используя библиотеку Pillow, с помощью хорошо подробных примеров программ.

Регулировка резкости изображения

Вы можете изменить резкость изображения с помощью класса ImageEnhance библиотеки PIL.

В этом руководстве мы узнаем, как повысить резкость или размыть изображение с помощью класса ImageEnhance библиотеки Python Pillow (PIL) с помощью некоторых хорошо иллюстрированных примеров.

Пошаговая инструкция

  • Прочтите изображение с помощью Image.open().
  • Создайте усилитель ImageEnhance.Sharpness() для изображения.
  • Увеличьте резкость изображения с помощью методаhance() на требуемый коэффициент.

Регулируя коэффициент, вы можете сделать изображение более резким или размытым.

В то время как коэффициент 1 дает исходное изображение, factor >1 увеличивает резкость изображения, а factor

Пример 1

В следующем примере мы увеличим резкость изображения с коэффициентом 1, что даст исходное изображение. Затем с коэффициентом 2, что даст более резкое изображение. А затем с коэффициентом 0,05, что даст размытое изображение.

from PIL import Image, ImageEnhance im = Image.open("original-image.png") enhancer = ImageEnhance.Sharpness(im) factor = 1 im_s_1 = enhancer.enhance(factor) im_s_1.save('original-image-1.png'); factor = 0.05 im_s_1 = enhancer.enhance(factor) im_s_1.save('blurred-image.png'); factor = 2 im_s_1 = enhancer.enhance(factor) im_s_1.save('sharpened-image.png');

Исходное изображение

Изображение с повышенной резкостью:

Изображение с повышенной резкостью

Размытое изображение

В этом уроке на примерах Python мы узнали, как настроить резкость изображения с помощью функции ImageEnhance.Sharpness().

Н астройка яркости изображения

Вы можете настроить яркость изображения с помощью библиотеки Pillow. Регулировка яркости означает либо равномерное увеличение значения пикселя по всем каналам для всего изображения, чтобы увеличить яркость, либо равномерное уменьшение значения пикселя по всем каналам для всего изображения для уменьшения яркости.

Увеличение яркости делает изображение белее, а уменьшение яркости делает изображение темнее.

Пошаговая инструкция

  1. Прочтите изображение с помощью Image.open().
  2. Создайте усилитель ImageEnhance.Brightness() для изображения.
  3. Увеличьте яркость изображения с помощью методаhance() на требуемый коэффициент.

Регулируя коэффициент, вы можете сделать изображение ярче или тусклее.

В то время как коэффициент 1 дает исходное изображение. Если установить коэффициент, равный 0, изображение станет черным, а коэффициент> 1 сделает изображение ярче.

Пример 1: с помощью PIL

В следующем примере мы сделаем изображение ярче с коэффициентом 1, что даст исходное изображение. Затем с коэффициентом 1,5, что даст более яркое изображение. А затем с коэффициентом 0,5, что даст затемненное изображение.

from PIL import Image, ImageEnhance #read the image im = Image.open("sample-image.png") #image brightness enhancer enhancer = ImageEnhance.Brightness(im) factor = 1 #gives original image im_output = enhancer.enhance(factor) im_output.save('original-image.png') factor = 0.5 #darkens the image im_output = enhancer.enhance(factor) im_output.save('darkened-image.png') factor = 1.5 #brightens the image im_output = enhancer.enhance(factor) im_output.save('brightened-image.png')

Исходное изображение

Более яркое изображение – с повышенной яркостью:

Более яркое изображение – с повышенной яркостью

Затемненное изображение – с уменьшенной яркостью:

Затемненное изображение – с уменьшенной яркостью

В этом руководстве на примерах Python мы узнали, как сделать изображение ярче с помощью хорошо детализированных программ.

Источник

Оцените статью