>백엔드 개발 >파이썬 튜토리얼 >OpenCv를 이용하여 간단한 점묘화 그리기.

OpenCv를 이용하여 간단한 점묘화 그리기.

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-28 00:51:19964검색

소개
OpenCV(오픈 소스 컴퓨터 비전 라이브러리)는 이미지나 비디오 파일과 같은 시각적 입력을 처리하기 위해 무료로 사용할 수 있는 프로그래밍 도구를 제공합니다. 여기에는 다양한 프로그래밍 언어를 통해 액세스할 수 있는 즉시 사용 가능한 많은 기능이 포함되어 있습니다. 여기에 게시한 예제에서는 Python을 사용합니다. 따라서 코드를 이해하려면 최소한 Python과 NumPy에 대한 기본 지식이 필요합니다. OpenCV에 대한 소개를 찾고 있다면 다음 링크가 매우 유용할 수 있습니다: [https://dev.to/arpitmandliya/opencv-python-tutorial-3dac].

픽셀이 이미지를 만드는 방법
대부분의 경우 컴퓨터 이미지는 RGB(Opencv의 BGR) 모델을 기반으로 합니다. 이는 픽셀 색상이 Red, Green 및 Blue 구성 요소의 혼합이라는 것을 의미합니다. 다른 모델(예: Hue, Saturation 및 Value)과 벡터 그래픽(SVG 또는 PDF)도 있지만 설명하지는 않겠습니다. 여기 있어요.

컴퓨터의 이미지는 색상 정보가 포함된 픽셀 모음으로 묘사될 수 있습니다. 보다 기술적인 용어로 말하면, 이미지는 처음 두 차원이 이미지의 크기(높이 및 너비)를 결정하고 세 번째 차원이 빨간색, 녹색 값을 포함하는 3차원 배열(또는 3개의 색상 채널이 있는 픽셀 매트릭스)입니다. 및 파란색(각 색상은 0에서 255 사이의 값을 가짐). 이미지에 색상 채널이 하나만 있는 경우(8비트 이미지) 0(검은색)부터 255(흰색)까지 다양한 회색 값을 갖는 회색조 이미지입니다. 그림 1이 이를 보여줍니다.

Making a simple pointillism painting using OpenCv.
그림 1: 이미지가 배열로 표현됩니다. 오른쪽에는 빨간색, 녹색, 파란색 값의 범위가 0~255(0,0,255는 파란색)인 컬러 이미지의 예가 있습니다. 왼쪽에는 다양한 회색 음영을 나타내는 단일 채널이 있는 회색조 이미지가 있습니다.

색상 정보를 다양한 크기의 도트로 변환
위에서 논의한 원칙은 NumPy 및 OpenCV 라이브러리를 사용하여 Python에서 이미지 편집을 수행하는 데 적용될 수 있습니다. 이 예에서는 루프를 사용하여 NumPy 배열로 표현된 이미지를 처리합니다. 루프는 이미지의 모든 픽셀을 반복하지는 않지만 일정한 간격으로 픽셀을 건너뜁니다(예: 10번째 픽셀마다 처리). 처리된 각 픽셀의 회색조 값은 도트 크기를 결정하는 데 사용됩니다(예: 회색조 값 100은 특정 도트 크기에 해당함). 그런 다음 원본 이미지의 색상 정보를 사용하여 원본 이미지의 빈 복사본에 이러한 점을 그립니다. 정리하자면, 원본 픽셀의 색상 정보를 바탕으로 다양한 크기의 도트를 그리는 이미지 카피를 생성합니다(그림 2 참조).

Making a simple pointillism painting using OpenCv.
그림 2: 점을 그리려면 원본 이미지의 픽셀 색상 정보가 사용됩니다. 점의 크기를 결정하기 위해 원본 이미지의 회색조 버전이 사용됩니다.

아래에서 코드를 찾을 수 있으며 가능한 결과는 그림 3.
에 나와 있습니다.

import numpy as np
import cv2

# load an image; image has to be in working directory when giving no path information 
img = cv2.imread('FlowerPower.jpg',cv2.IMREAD_UNCHANGED)
# show the dimensions of the image array
print(img.shape)

# choose a resizing factor for the whole image; to depict it on computer screen
resizing = .2
#convert original image to greyscale image
img_grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# make a copy of the orignal image 
img_output = img.copy()

# make a white canvas by assigning the color white (255,255, 255) to each pixel
# [:,:] covers all values of the first and second array dimension
img_output[:,:] = [255,255,255] # or with black [0,0,0] or any other color

# Settings for looping over the image
step_width = 40 # steps of loop; here: every 30th pixel
# - 1 fills circle that is drawn onto output image; positive value define
# line thickness of circle
thickness = -1 
perc = .2 # size factor for drawing circles/dots onto output image

# for loops running over the first two dimensions of the array (width and height) 
# step_width defines which pixels are included
for i in range(2,  img.shape[0] - step_width,  step_width):
    for u in range(2,  img.shape[1] - step_width,  step_width):        
        # radius (dot size) is based on the value of greyscale version of original image
        # at the current index; e.g., pixel at i = 10, u = 30 might have 123
        # perc variable modifies dot size 
        radius = int((255-img_grey[i,u])*perc) +1 
        if radius <= 0:
            radius +=1
        # take color from pixel at position [i,u] of original image
        # e.g., i = 10, u = 30 might have [123,0,61] 
        color = img[i,u].astype(int).tolist()
        # draw a circle on output image using dot size based on greyscale 
        # value with color of original image   
        cv2.circle(img_output, (u,i), radius, color, thickness)

# resize images, so they are not too big for computerscreen
# based on the resizing variable defined at the top of the page        
img_size = img.shape        
img_sm =  cv2.resize(img,(int(img_size[1]*resizing), int(img_size[0]
                         * resizing)), interpolation = cv2.INTER_CUBIC)
# open window that shows original image
cv2.imshow("Original", img_sm)
img_output_sm =  cv2.resize(img_output,(int(img_size[1]*resizing), int(img_size[0]*
                              resizing)), interpolation = cv2.INTER_CUBIC)
# show the dotted image
cv2.imshow("Dotted Image", img_output_sm)

Making a simple pointillism painting using OpenCv.
그림 3: 오른쪽에는 원본 이미지가 표시되고 왼쪽에는 여기에 제시된 코드를 기반으로 한 점선 버전이 표시됩니다.

포괄적인 방식으로 코드를 제시하여 누군가가 유용하다고 생각할 수 있기를 바랍니다. 원한다면 가지고 놀아보세요. 원을 직사각형으로 바꾸고, 다양한 크기의 원을 선택하고, 루프의 단계 너비 값을 변경하고 무슨 일이 일어나는지 확인하세요.

위 내용은 OpenCv를 이용하여 간단한 점묘화 그리기.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.