Улучшение контрастности, как линейно растянуть уровни серого изображения? - PullRequest
0 голосов
/ 02 ноября 2018

снимок экрана значений img 2 [это оригинал] 3 [это ожидаемый результат] это вывод I get Я пытаюсь растянуть уровни серого от 0-100 до 50-200 в Python, но изображение на выходе не так. Я нарисовал прямую линию, представляющую линейную зависимость между двумя диапазонами, а в строке 8 я использую это уравнение, чтобы получить результат. Что не так с моим кодом?

Это мой первый вопрос, извините за ошибки.

def Contrast_enhancement(img):
    newimg = img
    height = img.shape[0]
    width = img.shape[1]
    for i in range(height):
       for j in range(width):
           if(img[i][j] * 255 >= 0 and img[i][j] * 255 <= 100):
               newimg[i][j] = (((3/2) * (img[i][j] * 255)) + 50)/255
    return newimg

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

На ваш вопрос есть два ответа:

  • Сугубо технический (тот, на который @DonQuiKong пытается ответить), относящийся к тому, как сделать растяжение, на которое вы ссылаетесь, проще или правильнее.
  • Другой неявный и пытается ответить вам на актуальную проблему растяжения изображения.

Я сосредотачиваюсь на втором случае здесь. Судя по предоставленному образцу изображения, вы не используете правильный подход. Давайте рассмотрим предоставленные вами образцы, которые действительно имеют все значения интенсивности в диапазоне от 0 до 100 (из-за захвата экрана на моем компьютере они не отображаются, но это зависит от степени экрана). Ваш метод кажется правильным и должен работать с небольшими ошибками.

1) Например, небольшая ошибка:

newimg = img

не делает то, что вы думаете, что делает. Это создает псевдоним исходной переменной. Использование:

newimg = img.copy()

вместо.

2) Если изображение с разными границами приходит к вам, ваш код нарушен. По какой-то причине он будет игнорировать некоторые пиксели, и это не то, что вы хотели.

3) Требуемое растяжение можно применить ко всему изображению в этом случае, используя что-то вроде:

newimg -= np.min(newimg)
newimg /= np.max(newimg)

, который просто растягивает вашу интенсивность до границы 0-255.

4) Судя по вашим образцам изображений, вам также необходимо более радикальное растяжение (которое приведет к потере части информации об изображении для увеличения контрастности изображения). Вместо вышеперечисленного вы можете использовать нижний предел:

    newimg -= np.min(newimg)
    newimg /= (np.max(newimg) * 0.5)

Это эффективно «прожигает» некоторые пиксели, но в вашем случае результат выглядит ближе к желаемому. Кроме того, вы можете применить нелинейное отображение (например, логарифмическое) старых интенсивностей к новым, и вы не получите никаких «прожженных» пикселей.

Образец со значением 0,5:
enter image description here

0 голосов
/ 02 ноября 2018
import numpy as np
import copy
def Contrast_enhancement(img):
    newimg = np.array(copy.deepcopy(img)) #this makes a real copy of img, if you dont, any change to img will change newimg too
    temp_img=np.array(copy.deepcopy(img))*3/2+50/255
    newimg = np.where(newimg<=100,temp_img,newimg)
    return newimg

или короче:

import numpy as np
import copy
def Contrast_enhancement(img):
    newimg = np.array(copy.deepcopy(img)) #this makes a real copy of img, if you dont, any change to img will change newimg too

    newimg = np.where(newimg<=100,newimg*3/2+50/255,newimg)
    return newimg

Часть с копией должна решать вашу проблему, а часть с обломками - только для ускорения процесса. Np.where возвращает temp_img, если newimg <= 100, и newimg, если нет. </p>

...