행렬 원소 접근 방법
import numpy as np
def mat_access1(mat):
for i in range(mat.shape[0]):
for j in range(mat.shape[1]):
k = mat[i, j] # 원소 접근 - mat1[i][j] 방식도 가능
mat[i, j] = k * 2 # 원소 할당
def mat_access2(mat):
for i in range(mat.shape[0]):
for j in range(mat.shape[1]):
k = mat.item(i, j) # 원소 접근
mat.itemset((i, j), k * 2) # 원소 할당
mat1 = np.arange(10).reshape(2, 5)
mat2 = np.arange(10).reshape(2, 5)
print("원소 처리 전: \n%s\n" % mat1)
mat_access1(mat1)
print("원소 처리 후: \n%s\n" % mat1)
원소 처리 전:
[[0 1 2 3 4]
[5 6 7 8 9]]
원소 처리 후:
[[ 0 2 4 6 8]
[10 12 14 16 18]]
Mat::ptr()을 통한 행렬 원소 접근
import numpy as np, cv2, time
def pixel_access1(image):
image1 = np.zeros(image.shape[:2], image.dtype)
for i in range(image.shape[0]):
for j in range(image.shape[1]):
pixel = image[i,j] # 화소 접근
image1[i, j] = 255 - pixel # 화소 할당
return image1
def pixel_access2(image):
image2 = np.zeros(image.shape[:2], image.dtype)
for i in range(image.shape[0]):
for j in range(image.shape[1]):
pixel = image.item(i, j) # 화소 접근
image2.itemset((i, j), 255 - pixel) # 화소 할당
return image2
def pixel_access3(image):
lut = [255 - i for i in range(256)] # 룩업테이블 생성
lut = np.array(lut, np.uint8)
image3 = lut[image]
return image3
def pixel_access4(image):
image4 = cv2.subtract(255, image)
return image4
def pixel_access5(image):
image5 = 255 - image
return image5
image = cv2.imread("img/bright.jpg", cv2.IMREAD_GRAYSCALE)
if image is None: raise Exception("영상 파일 읽기 오류 발생")
# 수행시간 체크
def time_check(func, msg):
start_time = time.perf_counter()
ret_img = func(image)
elapsed = (time.perf_counter() - start_time) * 1000
print(msg, "수행시간 : %.2f ms" % elapsed)
return ret_img
image1 = time_check(pixel_access1, "[방법 1] 직접 접근 방식")
image2 = time_check(pixel_access2, "[방법 2] item() 함수 방식")
image3 = time_check(pixel_access3, "[방법 3] 룩업 테이블 방식")
image4 = time_check(pixel_access4, "[방법 4] OpenCV 함수 방식")
image5 = time_check(pixel_access5, "[방법 5] ndarray 연산 방식")
# 결과 영상 보기
cv2.imshow("image - original", image)
cv2.imshow("image1 - directly access to pixel", image1)
cv2.imshow("image2 - item()/itemset()", image2)
cv2.imshow("image3 - LUT", image3)
cv2.imshow("image4 - OpenCV", image4)
cv2.imshow("image5 - ndarray 방식", image5)
cv2.waitKey(0)
[방법 1] 직접 접근 방식 수행시간 : 586.87 ms
[방법 2] item() 함수 방식 수행시간 : 55.74 ms
[방법 3] 룩업 테이블 방식 수행시간 : 9.37 ms
[방법 4] OpenCV 함수 방식 수행시간 : 4.04 ms
[방법 5] ndarray 연산 방식 수행시간 : 0.77 ms
[방법 2] item() 함수 방식 수행시간 : 55.74 ms
[방법 3] 룩업 테이블 방식 수행시간 : 9.37 ms
[방법 4] OpenCV 함수 방식 수행시간 : 4.04 ms
[방법 5] ndarray 연산 방식 수행시간 : 0.77 ms
명암도 영상 생성
import numpy as np, cv2
image1 = np.zeros((50, 512), np.uint8) # 50 x 512 영상 생성
image2 = np.zeros((50, 512), np.uint8)
rows, cols = image1.shape[:2]
for i in range(rows): # 행렬 전체 조회
for j in range(cols):
image1.itemset((i, j), j//2) # 화소값 점진적 증가
image2.itemset((i, j), j // 20*10) # 계단 현상 증가
cv2.imshow("image1", image1)
cv2.imshow("image2", image2)
cv2.waitKey(0)
영상 화소값 확인
import cv2
image = cv2.imread("img/pixel.jpg", cv2.IMREAD_GRAYSCALE) # 영상 읽기
if image is None: raise Exception("영상 파일 읽기 오류")
(x,y),(w,h) = (180, 37), (15, 10) # 좌표는 x, y
roi_img = image[y:y+h, x:x+w] # 행렬 접근은 y, x
print("[roi_img] =")
for row in roi_img:
for p in row:
print("%4d" % p, end="") # 행렬 원 하나 출력
print()
[roi_img] =
56 51 59 66 84 104 154 206 220 208 203 207 205 204 204
75 57 53 53 72 71 100 152 195 214 212 201 209 207 205
88 76 65 53 51 60 73 96 143 200 219 200 206 204 202
91 92 80 63 53 59 59 61 89 144 195 222 205 200 205
89 94 90 82 63 54 51 56 65 92 149 203 223 209 196
89 91 90 89 84 64 54 55 51 56 94 140 208 223 203
91 86 84 85 97 86 72 59 50 53 66 81 148 211 216
92 86 85 88 92 95 88 70 55 53 59 64 89 155 211
88 85 86 90 87 87 89 86 72 56 50 53 59 88 175
87 85 86 88 87 84 86 90 86 70 53 44 51 56 111
56 51 59 66 84 104 154 206 220 208 203 207 205 204 204
75 57 53 53 72 71 100 152 195 214 212 201 209 207 205
88 76 65 53 51 60 73 96 143 200 219 200 206 204 202
91 92 80 63 53 59 59 61 89 144 195 222 205 200 205
89 94 90 82 63 54 51 56 65 92 149 203 223 209 196
89 91 90 89 84 64 54 55 51 56 94 140 208 223 203
91 86 84 85 97 86 72 59 50 53 66 81 148 211 216
92 86 85 88 92 95 88 70 55 53 59 64 89 155 211
88 85 86 90 87 87 89 86 72 56 50 53 59 88 175
87 85 86 88 87 84 86 90 86 70 53 44 51 56 111
cv2.rectangle(image, (x,y, w,h), 255, 1)
cv2.imshow("image", image)
cv2.waitKey(0)
행렬 가감 연산 통한 영상 밝기 변경
import cv2
image = cv2.imread("img/bright.jpg", cv2.IMREAD_GRAYSCALE) # 영상 읽기
if image is None: raise Exception("영상 파일 읽기 오류")
# OpenCV 함수 이용
dst1 = cv2.add(image, 100) # 영상 밝게 saturation 방식
dst2 = cv2.subtract(image, 100) # 영상 어둡게
# numpy array 이용
dst3 = image + 100 # 영상 밝게 modulo 방식
dst4 = image - 100 # 영상 어둡게
cv2.imshow("original image", image)
cv2.imshow("dst1- bright: OpenCV", dst1)
cv2.imshow("dst2- dark: OpenCV", dst2)
cv2.imshow("dst3- bright: numpy", dst3)
cv2.imshow("dst4- dark: numpy", dst4);
cv2.waitKey(0)
행렬 합과 곱 연산을 통한 영상 합성
import numpy as np, cv2
image1 = cv2.imread("img/add1.jpg", cv2.IMREAD_GRAYSCALE) # 영상 읽기
image2 = cv2.imread("img/add2.jpg", cv2.IMREAD_GRAYSCALE)
if image1 is None or image2 is None: raise Exception("영상 파일 읽기 오류 발생")
# 영상 합성
alpha, beta = 0.6, 0.7 # 곱샘 비율
add_img1 = cv2.add(image1 , image2) # 두 영상 단순 더하기
add_img2 = cv2.add(image1 * alpha , image2 * beta) # 두영상 비율에 따른 더하기
add_img2 = np.clip(add_img2, 0, 255).astype("uint8") # saturation 처리
add_img3 = cv2.addWeighted(image1, alpha, image2, beta, 0) # 두영상 비율에 따른 더하기
titles = ['image1','image2','add_img1','add_img2','add_img3']
for t in titles: cv2.imshow(t, eval(t))
cv2.waitKey(0)
영상 대비 변경
import numpy as np, cv2
image = cv2.imread("img/contrast.jpg", cv2.IMREAD_GRAYSCALE) # 영상 읽기
if image is None: raise Exception("영상 파일 읽기 오류 발생")
noimage = np.zeros(image.shape[:2], image.dtype) # 더미 영상
avg = cv2.mean(image)[0]/2.0 # 영상 화소 평균의 절반
dst1 = cv2.scaleAdd(image, 0.2, noimage) + 20 # 영상대비 감소
dst2 = cv2.scaleAdd(image, 2.0, noimage) # 영상대비 증가
dst3 = cv2.addWeighted(image, 0.5, noimage, 0, avg) # 명암대비 감소
dst4 = cv2.addWeighted(image, 2.0, noimage, 0,-avg) # 명암대비 증가
# 영상 띄우기
cv2.imshow("image", image)
cv2.imshow("dst1 - decrease contrast", dst1)
cv2.imshow("dst2 - increase contrast", dst2)
cv2.imshow("dst3 - decrease contrast using average", dst3)
cv2.imshow("dst4 - increase contrast using average", dst4)
cv2.imwrite("img/dst.jpg",dst1)
cv2.waitKey(0)
'Image Processing > OpenCV' 카테고리의 다른 글
[OpenCV] 03. 화소처리 (컬러 공간 변환) (0) | 2022.11.23 |
---|---|
[OpenCV] 02. 화소처리 (히스토그램) (0) | 2022.11.23 |
[OpenCV] 산출 연산 함수 (0) | 2022.11.21 |
[OpenCV] 기본 배열 연산 (Operations On Arrays) (0) | 2022.11.19 |
[OpenCV] VideoCapture (0) | 2022.11.15 |
댓글