본문 바로가기
  • 紹睿: 자유롭고 더불어 사는 가치있는 삶
Project/데이터 가지고 놀기

pixel-art :: openCV 기초 (2) - pixel 접근 및 이미지 복사

by 징여 2018. 2. 8.
반응형

openCV는 기본적으로 이미지가 3차원 행렬로 생성 된다.

(grayscale일 때는 행과 열로만 구성)



image1.jpeg

1.  image에 대한 기본 속성은  아래와 같이 확인할 수 있다.

1
2
3
4
5
6
7
8
9
print(img.shape)
# (669, 669, 3)
# grayscale의 경우 행과 열만 retrun됨
 
print(img.size)
# 1342683
 
print(img.dtype)
# uint8
cs


2. image에 특정 pixel에 접근이 가능하다.


1
2
3
4
5
6
7
8
9
px1 = img[10]
print(px1)
#[101 166 172]
 
# 1(행), 0(열)의 색값이 101(R), 166(G), 172(B)을 확인할 수 있다.
#Blue만 확인하고 싶을 경우
= img[102]
print(b)
#172
cs


2-1. 특정 pixel의 값을 변경하는 것 또한 가능하다.


1
2
img [:100, :100= [255255255]
#값이 흰색으로 변경된다.
cs



2-2. img.item으로도 접근이 가능하다

1
2
3
4
5
6
7
8
9
10
11
print(img[9999])
#[255 255 255]
 
#2를 통해서 blue에 접근이 가능하다.
print(img.item(99992))
#255
 
for i in range(100):
    for j in range(100):
        img.itemset((i, j, 2), 100)
#r(255) g(255) b(100)으로 바뀐다.
cs




ROI (Region of Image)


보통 이미지는 특정 pixel보다는 단위로 작업을 많이 하는데 이를 ROI라고 한다.

ROI는 보통 Numpy의 indexing을 이용한다.


1
2
3
4
5
6
7
8
9
10
11
12
yellowBox = img[:100, :100]
#plt.imshow(img)
 
img2 = cv2.copyMakeBorder(img,0,0,0,0,cv2.BORDER_REPLICATE)
 
img2[300:400300:400= yellowBox
 
plt.subplot(121)
plt.title('original'), plt.imshow(img), plt.xticks([]), plt.yticks([])
plt.subplot(122)
plt.title('add yellow box'), plt.imshow(img2), plt.xticks([]), plt.yticks([])
plt.show()
cs




그냥


1
img2 = img
cs
를 하게 될 경우, img2를 변경시 같이 반영되기 때문에, 이미지를 복사해서 이용해야 한다.




이미지를 복사하는 방법


cv2.copyMakeBorder(src, tmp, bottom, left, right, borderType)


borderType 종류

  • cv2.BORDER_REFLECT
  • cv2.BORDER_REFLECT_101
  • cv2.BORDER_REPLICATE
    1. cv2.BORDER_WRAP


    2. 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      original = cv2.imread('pic/image1.jpeg', cv2.IMREAD_COLOR)
       
      original = cv2.cvtColor(original, cv2.COLOR_BGR2RGB)
      same = cv2.copyMakeBorder(original,0,0,0,0,cv2.BORDER_REPLICATE)
      replicate = cv2.copyMakeBorder(original,150,50,50,50,cv2.BORDER_REPLICATE)
      reflect = cv2.copyMakeBorder(original,150,50,50,50,cv2.BORDER_REFLECT)
      wrap = cv2.copyMakeBorder(original,150,50,50,50,cv2.BORDER_WRAP)
      constant= cv2.copyMakeBorder(original,150,50,50,50,cv2.BORDER_CONSTANT,value=[0,0255])
       
       
      images= [original, same, replicate, reflect, wrap, constant]
      titles = ['original''same''replicate''reflect''wrap''constant']
       
      for i in range(len(images)):
          plt.subplot(23, i+1), plt.title(titles[i]), plt.imshow(images[i])
          plt.xticks([]), plt.yticks([])
      plt.show()
      cs



      반응형

      댓글