빈쿵바라기
좌충우돌 개발자의 기록
빈쿵바라기
전체 방문자
오늘
어제
  • 분류 전체보기 (53)
    • Programming (25)
      • JAVA (12)
      • Spring Boot (6)
      • JPA (7)
      • Python (0)
    • Database (12)
      • RDBMS (4)
      • NoSQL (7)
    • Server (11)
    • Elasticsearch (3)
    • ETC (2)

블로그 메뉴

    공지사항

    인기 글

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    빈쿵바라기

    좌충우돌 개발자의 기록

    Programming/JAVA

    색상 거리 구하기(feat. CIEDE2000)

    2023. 5. 30. 17:10
    public class CIEDE2000ColorDistance  {
    	
    	public static void main(String[] args) {
    		// 예시 색상 A와 B
            double[] colorA = { 53, 80, 678 }; // L*, a*, b* values for color A
            double[] colorB = { 86, -40, -22 }; // L*, a*, b* values for color B
    
            // CIEDE2000 거리 계산
            double distance = calculateDeltaE(colorA, colorB);
    
            System.out.println("CIEDE2000 거리: " + distance);
    	}
    	
    	/**
    	 * lab1과 lab2 색상 거리 비교
    	 * @param lab1
    	 * @param lab2
    	 * @return
    	 */
    	public static  double calculateDeltaE(double [] lab1, double[] lab2) {
    		return calculateDeltaE(lab1[0],lab1[1],lab1[2],lab2[0],lab2[1],lab2[2]);
    	}
    	
    	public static double calculateDeltaE(double L1, double a1, double b1, double L2, double a2, double b2) {
    		
    		double Lmean = (L1 + L2) / 2.0; 
    		double C1 =  Math.sqrt(a1*a1 + b1*b1); 
    		double C2 =  Math.sqrt(a2*a2 + b2*b2); 
    		double Cmean = (C1 + C2) / 2.0; 
    		
    		double G =  ( 1 - Math.sqrt( Math.pow(Cmean, 7) / (Math.pow(Cmean, 7) + Math.pow(25, 7)) ) ) / 2; 
    		double a1prime = a1 * (1 + G); 
    		double a2prime = a2 * (1 + G); 
    		
    		double C1prime =  Math.sqrt(a1prime*a1prime + b1*b1); 
    		double C2prime =  Math.sqrt(a2prime*a2prime + b2*b2); 
    		double Cmeanprime = (C1prime + C2prime) / 2;  
    		
    		double h1prime =  Math.atan2(b1, a1prime) + 2*Math.PI * (Math.atan2(b1, a1prime)<0 ? 1 : 0);
    		double h2prime =  Math.atan2(b2, a2prime) + 2*Math.PI * (Math.atan2(b2, a2prime)<0 ? 1 : 0);
    		double Hmeanprime =  ((Math.abs(h1prime - h2prime) > Math.PI) ? (h1prime + h2prime + 2*Math.PI) / 2 : (h1prime + h2prime) / 2); 
    		
    		double T =  1.0 - 0.17 * Math.cos(Hmeanprime - Math.PI/6.0) + 0.24 * Math.cos(2*Hmeanprime) + 0.32 * Math.cos(3*Hmeanprime + Math.PI/30) - 0.2 * Math.cos(4*Hmeanprime - 21*Math.PI/60); 
    		
    		double deltahprime =  ((Math.abs(h1prime - h2prime) <= Math.PI) ? h2prime - h1prime : (h2prime <= h1prime) ? h2prime - h1prime + 2*Math.PI : h2prime - h1prime - 2*Math.PI); 
    		
    		double deltaLprime = L2 - L1; 
    		double deltaCprime = C2prime - C1prime; 
    		double deltaHprime =  2.0 * Math.sqrt(C1prime*C2prime) * Math.sin(deltahprime / 2.0); 
    		
    		double SL =  1.0 + ( (0.015*(Lmean - 50)*(Lmean - 50)) / (Math.sqrt( 20 + (Lmean - 50)*(Lmean - 50) )) ); 
    		double SC =  1.0 + 0.045 * Cmeanprime; 
    		double SH =  1.0 + 0.015 * Cmeanprime * T; 
    		
    		double deltaTheta =  (30 * Math.PI / 180) * Math.exp(-((180/Math.PI*Hmeanprime-275)/25)*((180/Math.PI*Hmeanprime-275)/25));
    		double RC =  (2 * Math.sqrt(Math.pow(Cmeanprime, 7) / (Math.pow(Cmeanprime, 7) + Math.pow(25, 7))));
    		double RT =  (-RC * Math.sin(2 * deltaTheta));
    		
    		double KL = 1; 
    		double KC = 1; 
    		double KH = 1; 
    		
    		double deltaE = Math.sqrt(
    				((deltaLprime/(KL*SL)) * (deltaLprime/(KL*SL))) +
    				((deltaCprime/(KC*SC)) * (deltaCprime/(KC*SC))) +
    				((deltaHprime/(KH*SH)) * (deltaHprime/(KH*SH))) +
    				(RT * (deltaCprime/(KC*SC)) * (deltaHprime/(KH*SH)))
    				);
    				
    		return deltaE;
    	}
    	
    }

     

    참고자료

    • https://en.wikipedia.org/wiki/Color_difference
    • https://github.com/wuchubuzai/OpenIMAJ/blob/master/image/image-processing/src/main/java/org/openimaj/image/analysis/colour/CIEDE2000.java
    저작자표시 (새창열림)

    'Programming > JAVA' 카테고리의 다른 글

    [pdfbox] PDF 파일을 Image파일로 변환하는 방법  (0) 2023.05.10
    JAVA SHA-256 암호화 방법  (0) 2023.05.10
    [Apache VFS] SFTP 파일 업로드  (0) 2023.03.08
    [openhtmltopdf] HTML을 PDF로 변환하기  (0) 2023.01.18
    [Apache Tika] 문서파일에서 텍스트 추출하기  (0) 2022.12.15
      'Programming/JAVA' 카테고리의 다른 글
      • [pdfbox] PDF 파일을 Image파일로 변환하는 방법
      • JAVA SHA-256 암호화 방법
      • [Apache VFS] SFTP 파일 업로드
      • [openhtmltopdf] HTML을 PDF로 변환하기
      빈쿵바라기
      빈쿵바라기
      삽질하는 개발자의 좌충우돌 개발기

      티스토리툴바