Пороговое значение Python OpenCV с помощью логического индексирования

Я пытаюсь установить определенные значения в изображении в градациях серого. До сих пор мне удавалось вводить определенные диапазоны чисел, но я хочу взять значения от 50 до 150 и умножить их на 1,2. Я не уверен, как я могу получить доступ к числу внутри вектора, чтобы затем умножить его на 1,2.

myimg[myimg <= 50] = 0
myimg[myimg > 150 ] = 255
myimg[50<myimg<=150] = myimg * 1.2 #this line produces this error: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

person Flawless    schedule 25.05.2020    source источник
comment
как насчет (myimg>50) & (myimg<=150) ? И, вероятно, вам придется использовать его с обеих сторон myimg[(myimg>50) & (myimg<=150)] = myimg[(myimg>50) & (myimg<=150)] * 1.2 или написать его в более короткой версии myimg[(myimg>50) & (myimg<=150)] *= 1.2   -  person furas    schedule 25.05.2020


Ответы (2)


Вот три возможных способа сделать это.

Первый просто умножает изображение на коэффициент 1,2 и пороговые значения на коэффициент 1,2 и использует новые пороговые значения.

Второй умножает изображение на коэффициент 1,2, создает маску из порогового значения. Использует маску, чтобы сделать изображение черно-белым в нужных областях.

Третий метод больше похож на то, что вы хотите, без необходимости обработки всего изображения.

Вход (линейное градиентное изображение):

введите здесь описание изображения

import cv2
import numpy as np

# read image as grayscale
img = cv2.imread('grad.png', cv2.COLOR_BGR2GRAY)

# Method 1

# set threshold values
tlow = 50
thigh = 150

# multiply image by 1.2
result1 = img.copy()
result1 = (1.2 * result1).clip(0,255).astype(np.uint8)

# compute modified threshold values
tlow = int(1.2 * tlow)
thigh = int(1.2 * thigh)
result1[result1 <= tlow] = 0
result1[result1 > thigh ] = 255
print(tlow, thigh)


# Method 2

# set threshold values
tlow = 50
thigh = 150

# create mask that is black outside the desired range and white inside the desired range
mask = img.copy()
mask[mask <= tlow] = 0
mask[mask > thigh ] = 255

# modify input by 1.2 factor
result2 = img.copy()
result2 = (1.2 * result2).clip(0,255).astype(np.uint8)

# use mask to combine the input and the modified image
result2[mask==0] = 0
result2[mask==255] = 255

# method 3

# set threshold values
tlow = 50
thigh = 150

result3 = img.copy()
result3[result3 <= tlow] = 0
result3[result3 > thigh ] = 255
result3 = result3.astype(np.float32)
result3[(result3>50) & (result3<=150)] *= 1.2
result3 = result3.clip(0,255).astype(np.uint8)

# save result
cv2.imwrite("grad_process1.png", result1)
cv2.imwrite("grad_mask.png", mask)
cv2.imwrite("grad_process2.png", result2)
cv2.imwrite("grad_process3.png", result3)

# view result
cv2.imshow("result1", result1)
cv2.imshow("mask", mask)
cv2.imshow("result2", result2)
cv2.imshow("result3", result3)
cv2.waitKey(0)
cv2.destroyAllWindows()


Результат 1:

введите здесь описание изображения

Результат 2:

введите здесь описание изображения

Результат 3:

введите здесь описание изображения

person fmw42    schedule 25.05.2020

Вместо 50<myimg<=150 используйте

(myimg>50) & (myimg<=150)

и не забывайте (), потому что это не сработает.

И вам нужен массив одинакового размера с обеих сторон =

myimg[(myimg>50) & (myimg<=150)] = myimg[(myimg>50) & (myimg<=150)] * 1.2

или короче

myimg[(myimg>50) & (myimg<=150)] *= 1.2

Пример кода

import numpy as np
import random

random.seed(0)

myimg = np.array([random.randint(0, 255) for x in range(10)], float)
print(myimg)

myimg[(myimg>50) & (myimg<=150)] = myimg[(myimg>50) & (myimg<=150)] * 1.2
#myimg[(myimg>50) & (myimg<=150)] = myimg * 1.2

print(myimg)
person furas    schedule 25.05.2020