Pic2Face
2021. 3. 17. 16:36ㆍPS/Problem Solving
(학교 정보과학프로젝트 시간에 만들었다고 아무도 말하지 않았습니다.)
||
||
||
V
사진을 입력하면 사진에 웃는 형태의 틀을 덮어 씌워 준다.
본격 Pic2Face 메소드
이 버전은 검은색이 주류인 사진은 사용할 수 없다.
//Full Code : http://colorscripter.com/s/STJKOfy
inline void Gradient(unsigned char B[HEIGHT][WIDTH],unsigned char G[HEIGHT][WIDTH],unsigned char R[HEIGHT][WIDTH],int weight=400) {
double fordivideheight = 1.0*HEIGHT / weight;
double fordividewidth = 1.0*WIDTH / weight;
int MAX = 0;
for(int i=0;i<HEIGHT;i++)
for(int j=0;j<WIDTH;j++){
int chg1 = std::abs(i / fordivideheight-weight*0.73) + std::abs(j / fordividewidth - weight*0.75);
int chg2 = std::abs(i / fordivideheight-weight*0.73) + std::abs(j / fordividewidth - weight*0.25);
int chg3 = std::abs(i / fordivideheight-weight*0.5) + std::abs(j / fordividewidth - weight*0.5);
chg3 *= 2;
double xcoor = std::abs(j / fordividewidth - weight*0.5);
double ycoor = std::abs(i / fordivideheight-weight*0.01);
double expycoor = xcoor*xcoor*0.0111;
int chg4 = 100;
if(std::abs(ycoor-expycoor)<10) chg4 = 0;
int change = std::min({chg1,chg2,chg3,chg4});
for(auto pt:{&B[i][j],&G[i][j],&R[i][j]}){
auto&x = *pt;
x = std::min(std::max(x-change*4,0),255);
}
}
}
Hard-Coding으로 개발했기에 가독성과 범용성이 뛰어나다고
절대 말할 수 없다.
원리는 눈을 만들고 싶은 좌표를 입력 받아서 그곳을 기준으로 해밀턴거리가 특정 값 이하인 곳만 원 색을 보존한다. (거리가 멀어질 수록 밝기를 낮게)
이제 입꼬리 모양은 $y = 0.0111 x^2$를 기준으로 특정 폭 이하인 좌표들만 밝기를 유지한다.
본격 개발자가 휴리스틱 돌리는 개발 ㅋㅋ
728x90
'PS > Problem Solving' 카테고리의 다른 글
뫼비우스 역공식 (1) | 2021.03.25 |
---|---|
Cgiosy의 수학 코드 (0) | 2021.03.22 |
독자들에게 가끔씩 바라는 점 (24) | 2021.03.09 |
메타인지 #1 (0) | 2021.03.07 |
CF #705 Div.2 (0) | 2021.03.07 |