OpenCV

OpenCV 파이선 강의 실습 코드 3

지구빵집 2023. 11. 22. 17:57
반응형

OpenCV – Python 영상처리 프로그래밍  

 

강의 슬라이드 199 - OpenCV 점 기반 처리 1  

 

컬러 영상에 대하여 RGB로 구분한 후에 히스토그램을 계산  

 

 

import cv2
import numpy as np
from matplotlib import pyplot as plt

c_image = cv2.imread('rena.jpg', cv2.IMREAD_UNCHANGED)

c_hist_b = cv2.calcHist([c_image], [0], None, [256], [0, 256])
c_hist_g = cv2.calcHist([c_image], [1], None, [256], [0, 256])
c_hist_r = cv2.calcHist([c_image], [2], None, [256], [0, 256])

plt.title('Histogram')
plt.plot(c_hist_r, color='r')
plt.plot(c_hist_g, color='g')
plt.plot(c_hist_b, color='b')

cv2.imshow("Color image", c_image)
plt.show()

cv2.waitKey(0)

 

 

회색조 영상에 대하여 히스토그램을 계산하고 matplotlib 라이브러리를 통하여 그래프로 출력  

 

import cv2
import numpy as np
from matplotlib import pyplot as plt

c_image = cv2.imread('lena-gray.jpg', cv2.IMREAD_GRAYSCALE)

g_hist = cv2.calcHist([c_image], [0], None, [256], [0, 256])

plt.title('Histogram')
plt.plot(g_hist, color='black')

cv2.imshow("Color image", c_image)
plt.show()

cv2.waitKey(0)

 

 

회색조 영상에 대하여 ‘a’ 키를 누를 때 마다 밝기 값을 증가시키고, ‘s’ 키를 누를 때 마다 밝기값을 감소  

 

완전 힌색을 만들고 나면 다시 안 돌아옴

 

import cv2
import numpy as np
from matplotlib import pyplot as plt

g_image = cv2.imread('figures100.jpg', cv2.IMREAD_GRAYSCALE)

while True:
    cv2.imshow('Image', g_image)

    key = cv2.waitKey(0)
    if key == ord('a'):
        g_image = cv2.add(g_image, 10)
    elif key == ord('s'):
        g_image = cv2.subtract(g_image, 10)
    else:
        break

 

 

단순한 대수 연산으로 밝기값을 10씩 증가시키거나 10씩 감소시켜서 오버플로우와 언더플로우가 발생  

 

import cv2

g_image = cv2.imread('figures100.jpg', cv2.IMREAD_GRAYSCALE)

while True:
    cv2.imshow('Image', g_image)

    key = cv2.waitKey(0)
    if key == ord('a'):
        g_image = g_image + 10
    elif key == ord('s'):
        g_image = g_image - 10
    else:
        break

 

 

회색조 영상에 대하여 ‘m’ 키를 누를 때 마다 명암 대비를 증가시키고, ‘d’ 키를 누를 때 마다 명암 대비를 감소  

 

import cv2

g_image = cv2.imread('figures100.jpg', cv2.IMREAD_GRAYSCALE)

while True:
    cv2.imshow('Image', g_image)

    key = cv2.waitKey(0)
    if key == ord('m'):
        g_image = cv2.multiply(g_image, 2)
    elif key == ord('d'):
        g_image = cv2.divide(g_image, 2)
    else:
        break

 

 

회색조 영상에 대하여 수학적으로 반전하거나 비 트 단위 NOT 연산을 적용하여 반전한 영상을 생성  

 

import cv2

g_image = cv2.imread('figures-gray.jpg', cv2.IMREAD_GRAYSCALE)

image1 = cv2.subtract(255, g_image)
image2 = cv2.bitwise_not(g_image)

cv2.imshow('Image', g_image)
cv2.imshow('Inverse Image1', image1)
cv2.imshow('Inverse Image2', image2)

cv2.waitKey(0)

 

 

원형의 마스크를 생성하고 입력 영상에 마스크 적용을 통하여 마스크 위치에 해당하는 영상 내용만 출력  

 

import cv2
import numpy as np

org_image = cv2.imread('figures100.jpg', cv2.IMREAD_UNCHANGED)
h, w, c = org_image.shape

#mask
mask = np.zeros((h, w, 3), np.uint8)
cv2.circle(mask, (256, 256), 64, (255, 255, 255), -1) #filled

rst_image = cv2.bitwise_and(org_image, mask)

cv2.imshow('Original', org_image)
cv2.imshow('Mask', mask)
cv2.imshow('Result', rst_image)

cv2.waitKey(0)

 

 

원형 마스크 생성, 입력 영상 마스크 적용, 마스크 적용된 영역만 출력 사용자가 j,k,i,m 키보드 누르는 것에 따라서 마스크 위치 20씩 이동  

 

import cv2
import numpy as np

org_image = cv2.imread('figures100.jpg', cv2.IMREAD_UNCHANGED)
h, w, c = org_image.shape

x, y = 255, 255

#mask

while True:
    mask = np.zeros((h, w, 3), np.uint8)
    cv2.circle(mask, (x, y), 64, (255, 255, 255), -1) #filled

    rst_image = cv2.bitwise_and(org_image, mask)

    cv2.imshow('Mask', mask)
    cv2.imshow('Result', rst_image)

    key = cv2.waitKey(0)
    if key == ord('j'):
        x -= 20
    elif key == ord('k'):
        x += 20
    elif key == ord('i'):
        y -= 20
    elif key == ord('m'):
        y += 20
    else:
        break

 

 

두 장의 컬러 영상에 대하여 ‘1’을 누르면 1번 영 상에 가깝게, ‘2’를 누르면 2번 영상에 가깝게 영상을 합성  

 

import cv2
import numpy as np

f1_image = cv2.imread('fruit1-512.jpg', cv2.IMREAD_UNCHANGED)
f2_image = cv2.imread('fruit2-512.jpg', cv2.IMREAD_UNCHANGED)

alpha = 0.5
while True:
    cv2.imshow("f1 image", f1_image)
    cv2.imshow("f2 image", f2_image)

    key = cv2.waitKey(0)
    if key == ord('1'):
        alpha -= 0.1
        alpha = max(alpha, 0.0)
    elif key == ord('2'):
        alpha += 0.1
        alpha = min(alpha, 1.0) #clipping
    else:
        break

    b_image = cv2.addWeighted(f1_image, 1.0-alpha, f2_image, alpha, 0)
    cv2.imshow("Blended Image", b_image)

 

 

회색조 영상에 대하여 히스토그램 평준화하여 히 스토그램과 영상을 출력  

 

import cv2
from matplotlib import pyplot as plt
import numpy as np

g_image = cv2.imread('lena-gray.jpg', cv2.IMREAD_GRAYSCALE)

#stretching
n_image = cv2.normalize(g_image, None, 0, 255, cv2.NORM_MINMAX)

g_hist = cv2.calcHist([g_image], [0], None, [256], [0, 256])
n_hist = cv2.calcHist([n_image], [0], None, [256], [0, 256])

plt.title('Histogram')
plt.plot(g_hist, color='gray')
plt.plot(n_hist, color='blue')

cv2.imshow('Gray Image', g_image)
cv2.imshow('Stretch image', n_image)
plt.show()

cv2.waitKey(0)

 

 

회색조 영상에 대하여 히스토그램 평준화하여 히 스토그램과 영상을 출력  

 

import cv2
from matplotlib import pyplot as plt
import numpy as np

g_image = cv2.imread('lena-gray.jpg', cv2.IMREAD_GRAYSCALE)

#equalization
n_image = cv2.equalizeHist(g_image)

g_hist = cv2.calcHist([g_image], [0], None, [256], [0, 256])
n_hist = cv2.calcHist([n_image], [0], None, [256], [0, 256])

plt.title('Histogram')
plt.plot(g_hist, color='gray')
plt.plot(n_hist, color='blue')

cv2.imshow('Gray Image', g_image)
cv2.imshow('Stretch image', n_image)
plt.show()

cv2.waitKey(0)

 

 

 

회색조 영상에 대하여 임계값 필터링을 수행 

 

import cv2
from matplotlib import pyplot as plt
import numpy as np

g_image = cv2.imread('fruit1-512.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('Original Image', g_image)

ret, tb_image = cv2.threshold(g_image, 128, 255, cv2.THRESH_BINARY)
ret, bi_image = cv2.threshold(g_image, 128, 255, cv2.THRESH_BINARY_INV)
ret, tr_image = cv2.threshold(g_image, 128, 255, cv2.THRESH_TRUNC)
ret, tz_image = cv2.threshold(g_image, 128, 255, cv2.THRESH_TOZERO)
ret, os_image = cv2.threshold(g_image, 128, 255, cv2.THRESH_OTSU)

cv2.imshow('THRESH_BINARY', tb_image)
cv2.imshow('THRESH_BINARY_INV', bi_image)
cv2.imshow('THRESH_TRUNC', tr_image)
cv2.imshow('THRESH_TOZERO', tz_image)
cv2.imshow('THRESH_OTSU', os_image)

cv2.waitKey(0)

 

 

적응적 임계값 필터

입력 영상에 대하여 가로 방향으로 조명 노출된 영상을 생성하고 임계 값 필터링을 수행. ppt 267 page

 

import cv2
from matplotlib import pyplot as plt
import numpy as np

g_image = cv2.imread('fruit-512-256.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('Original Image', g_image)

h, w = g_image.shape

e_image = g_image.copy()
for i in range(0, 512):
    for j in range(0, 256):
        value = e_image[j, i] * 0.006 * i
        if value > 255:
            e_image[j, i] = 255
        else:
            e_image[j, i] = value
cv2.imshow('Exposed image', e_image)

ret, tb_image = cv2.threshold(e_image, 128, 255, cv2.THRESH_BINARY)
at_image = cv2.adaptiveThreshold(e_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
                                 cv2.THRESH_BINARY, 15, 2)

cv2.imshow('Single Threshhold image', tb_image)
cv2.imshow('Adaptive Threshold image', at_image)

cv2.waitKey(0)

 

 

 

 

 

 

 

반응형