1. 문제 설명
픽셀 값이 특정 조건을 만족하는 픽셀만 수정하고 싶기 때문에 Numpy 의 where 메소드 를 사용합니다. .
이제 조건을 만족하는 픽셀 값에 델타를 더하고 싶은데요, 더해진 델타 값이 255보다 크면 픽셀 값을 255로 설정하고, 0보다 작으면 0으로 설정합니다. 델타가 추가될 때 값이 255보다 크면 포인트 값이 255로 설정되지 않는다는 것을 발견했습니다. 예를 들어 3*3 매트릭스를 사용하십시오.
이미지의 각 채널 요소의 비트 심도는 일반적으로 uint8 이므로 여기 이미지의 특정 채널의 매트릭스를 시뮬레이션하기 위해 Declare when 매트릭스를 생성합니다.dtype=np.uint8
delta=250
L1=np.array([[0,20,40],[3,14,4],[1,30,15]],dtype=np.uint8)
a1=np.where(L1+delta>255 ,255,0)
결과는 다음과 같습니다.
[[0 0 0]
[0 0 0]
[0 0 0]]
L1+delta>255의 값이 255로 설정되지 않은 것으로 나타났다.
2. 문제 분석
이것은 주로 L1 요소의 비트 심도와 관련이 있으며 uint8 의 범위 는 0~255 이며 합산 결과가 255 보다 크면 결과를 255 로 나누고 나머지를 취하게 됩니다. 255를 넘은 후 0부터 더하는 것입니다. 이런 식으로 L1+delta 값은 255보다 크지 않습니다.
3. 솔루션
L1의 비트 심도를 먼저 uint16으로 변경한 다음 작업 후 원래 uint8로 변경합니다(필요한 경우).
import numpy as np
import cv2
delta=250
L1=np.array([[0,20,40],[3,14,4],[1,30,15]],dtype=np.uint8)
L1=np.uint16(L1)
a1=np.where(L1+delta>255 ,255,0)
print(a1)
출력 결과:
[[ 0 255 255]
[ 0 255 0]
[ 0 255 255]]
원래 픽셀 값에 델타를 더한 값이 255보다 크면 모두 255로 설정되어 문제가 해결된 것을 볼 수 있습니다!