Jacquard Weave Algorithm 01

_직조의 원리를 Grasshopper에 적용하기

<image sampler>를 이용하면 grasshopper로 각종 image를 쉽게 불러드릴 수 있고 이를 수치 data로 환원시킬 수 있다. 이는 특히 특정한 pattern을 가지는 image를 수치 data로 변환시키는데 매우 유용하다. 이 방법에 대해서 알아보도록 하자.

Figure 1


Figure 1 <Image Sampler>는 이미지를 수치 data로 변환시킬 수 있다.

<Image Sampler>는 image와 좌표값을 input으로 가진다. 주어진 image의 해당 좌표에 있는 pixel의 색정보를 추출(evaluate)하는 기능을 가지고 있다.[1] 예를 들어 격자로 배열된 점의 좌표값이 주어지면 이미지에서 주어진 좌표값에 해당하는 pixel에서 정보를 추출하는 것이다. 특히 흑백이미지(grayscale)는 픽셀이 하얀색과 검은색으로 구성되어있기 때문에 이러한 정보를 쉽게 활용할 수 있다. 이때 흑백이미지에 있는 pattern의 각각의 cell의 중심점을 사용하는 것이 중요하다. 위에서 소개한 pattern imager의 경우 cell이 격자형태로 배열되고 각 cell이 흑, 백의 data를 가지게 된다. 이때 하나의 cell은 다시 여러개의 pixel로 구성된다.

그러므로 이러한 algorithm 에서 가장 먼저 필요한 것은 data를 추출하고픈 pixel의 좌표값을 생성하는 것이다. 이것을 <image sampler>를 이용하여 image에 적용하면 해당 pixel의 정보를 얻을 수 있다. 이때 각 cell의 중심에 있는 pixel을 고르는 것이 중요하다. 그렇지 않으면 원하지 않는 정보가 입력될 수 있기 때문이다.

Figure 2


Figure 2 <Image Samping>을 사용할때 추출점을 각 픽셀의 중앙에서 취하도록 조절해야 한다. 그렇지 않으면 원하지 않는 데이터가 입력될 수 있다. 흑백으로된 pattern image를 사용하면 무척 유용하다.

 

Figure 3


Figure 3 Source Image를 확대해보면 픽셀의 사이에 흑과 백이 아닌 중간톤의 색을 가진 영역을 찾을 수 있다. 이번 algorithm에서는 흑, 백의 정보가 필요하기 때문에 정확한 좌표값 input을 통하여 이러한 점을 피해주는 것이 중요하다.

 

 

 

_<Image Sampling> Process를 위한 점 생성하기

샘플로 사용될 점을 생성하기 위해서는 먼저 격자로 배열된 점이 필요하다. 행(row)에 들어가는 점의 개수와 열(column)에 들어가는 점의 개수가 Sample Image에서 각 방향에 cell의 수와 일치하여야 한다. 각 점들사이의 거리를 알기 위한 가장 쉬운 방법은 image의 가로 세로 방향의 크기(resolution)을 알아낸 뒤 이것을 각 cell의 pixel의 수로 나누어 주는 것이다. 먼저 이미지의 가로 방향 pixel의 수를 <Image_size_x_pixel>에, 새로방향 pixel의 수를 <Image_size_y_pixel>에 너어주도록 하자.

 

Figure 4


Figure 4 Image의 x,y방향의 pixel의 수와 각 cell의 pixel 수를 직접 입력하였다. (x는 image의 너비를, Y는 image의 높이를 의미한다.) 이를 <division>을 이용하여 나누어 주면 cell의 개수를 생성할 수 있다. 여기서 경우에 따라 소수값이 나올 수 있는데 이를 다시 <f1 ; fix(x)>에 연결하여 결과값을 정수로 만들어준다.

이때까지 생성한 정보들을 이용하여 point grid를 생성하도록 하자. 앞서 언급한 것처럼 각 cell의 중심에 점을 위치시켜야 한다. 그러기 위해서는 점의 격자에서 첫번째 점[2]의 위치가 각 cell의 pixel수의 절반 값이어야 한다. <Cell_size_x_pixel>, <Cell_size_y_pixel>에 입력된 cell의 가로, 새로 방향 pixel 정보를 <f1 ; x/2>에 연결하여 값을 반으로 나눈다. 이 값은 후에 만들어질 point grid의 첫번째 점이 된다. 다시 <f1 ; x/2> 에서 나온 값을 각각 <Image_size_x_pixel>, <Image_size_y_pixel> 에 입력된 Image의 전체 가로 세로 픽셀 수에서 빼주준다. 이렇게 나온 좌표값은 point grid의 마지막 점[3]의 좌표가 된다. 첫번째 점과 마지막 점의 x 좌표를 구간으로 하는 <domain>을 만들어준다. 이 값과 <f1 ; fix(x)>에서 구한 값에 <f1 ; x-1>을 적용한 값[4]을 <range>에 입력하면 필요한 x 좌표값을 생성할 수 있다. 같은 방법으로 Y방향의 좌표값도 생성해주도록 하자.

 

Figure 5


Figure 5 이제 이렇게 만들어진 <domain>을 <range>에 입력하고 cell의 개수에서 1을 뺀 값으로 나누어 준다. 만약 cell의 개수에서 1을 빼주지 않으면 필요한 값의 수보다 하나를 더 가지게 되기 때문이다. 이렇게 하면 point grid를 생성하는데 필요한 x, y 좌표값을 구할 수 있다. 물론 <series>를 이용하면 더욱 쉽게 algorithm을 완성할 수 있지만 정확도가 떨어지게 된다. 이를 방지하기 위해서라도 위와 같은 방법을 취하도록 하자.

 

Figure 6


Figure 6 x 방향의 좌표값을 가지는 <range>와 y 방향의 좌표값을 가지는 <range>를 <XYZ point>의 X와 Y값에 입력해준다. 이때 y좌표값은 <graft>를 이용하여 tree 구조로 변환시켜준다.  이렇게 되면 같은 y값을 가지는 data들이 하나의 branch 안에 저장되며 각 branch에는 x방향에 있는 cell의 수와 같은 점들이 생성되게 된다. 즉 Image에서 각 행(row)방향, x방향에 있는 cell들이 씨실(weft)의 굴곡을 결정하게 되는데 이 정보가 하나의 branch안에 저장되는 것이다.

 

Figure 7


Figure 7 이미지 샘플링을 할때 반드시 해야하는 것 중 하나이다. <image sampler>를 우클릭하여 context pop-up menu를 불러온 뒤 이것을 이용하여 import된 이미지의 x, y domain을 입력해주어야 한다. 만약 이 domain이 설정되지 않으면 출력되는 data가 Null 값이 되게 된다.

 

Figure 8


Figure 8 Grayscale로 된 image를 사용할때는 <image sampler>의 filter를 ‘Value’로 설정해주어야 한다. 그냥 Colour로 둘 경우 R, G, B 값을 출력하기 때문이다. 이 algorithm에서 색은 의미가 없으므로 image에서 밝기(brightness)만 취해주면 된다.

 

 

Figure 9


Figure 9 직조 pattern (weaving pattern)을 가지는 image에서 algorithm에 필요한 data를 추출하였다.

 

 

 


[1] <역자 주> 이때 추출되는 정보는 설정된 filter에 따라 여러가지로 변환될 수 있다. 기본적으로 0~255에 해당하는 R,G,B 값을 추출할 수 있으며 ‘투명도(transparency)’와 ‘밝기(brightness)’를 추출하는 것이 가능하다.

[2] 역자 주: 첫번째 점이란 점의 (x,y) 좌표값를 기준으로 그 값이 가장 작은 점을 의미한다.

[3] 역자 주: 마찬가지로 마지막 점이란 점의 (x,y) 좌표값이 가장 큰 점을 의미한다.

[4] 역자 주: cell의 수보다 1이 작은 수로 <domain>을 나눠야 cell의 수와 일치하는 수의 좌표값을 생성할 수 있다. <divide curve>에서 curve를 5등분 하면 여섯 개의 점이 생기는 것을 생각해보자.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s