복붙노트

[SQL] 데이터베이스에 가장 가까운을 찾을 수있는 가장 좋은 방법 일 것입니다 무슨 RGB 값을 감안할 때?

SQL

데이터베이스에 가장 가까운을 찾을 수있는 가장 좋은 방법 일 것입니다 무슨 RGB 값을 감안할 때?

나는 RGB 값을 가지고 내 데이터베이스에 색상 표에 존재하지 않는 경우에 나는 가장 가까운 색을 찾아야합니다. 나는 모든 값을 비교 한 후 평균을 (빨간색, 녹색 및 파란색)의 차이를 찾는 생각했다. 가장 낮은 평균 편차는 가장 가까운 색이어야한다. 더 나은 방법이 있어야한다처럼 나에게 보인다. 어떤 아이디어?

해결법

  1. ==============================

    1.3 차원 공간에서 벡터로 색을 고려, 당신은 쉽게 3 차원 피타고라스를 사용하여 차이를 계산할 수 있습니다 :

    3 차원 공간에서 벡터로 색을 고려, 당신은 쉽게 3 차원 피타고라스를 사용하여 차이를 계산할 수 있습니다 :

    d = sqrt((r2-r1)^2 + (g2-g1)^2 + (b2-b1)^2)
    

    그러나, 노트 색상이 그다지 완벽하지 눈에 의한 해석의 대상이되는 때문에, 당신은 그들이 동일한 중요성을 피하기 위해 색상을 조정할 수 있음.

    예를 들어, 전형적인 가중 방식을 사용 :

    d = sqrt(((r2-r1)*0.3)^2 + ((g2-g1)*0.59)^2 + ((b2-b1)*0.11)^2)
    

    눈이 녹색에 가장 민감한, 그래서 더 큰 숫자의 차이가 있어야 청색 성분 만 다른 블루, 두 가지 색상에 가장 둔감하기 때문에 녹색 성분에 같은 숫자의 차이를 하나보다 "더 이상의 서로 다른"으로 간주한다.

    이 계산을 최적화 할 수있는 다양한 방법도 있습니다. 당신이 정말로 실제 D 값에 관심이없는 것 때문에 예를 들어, 당신은 제곱근으로 분배 할 수 있습니다 :

    d =   ((r2-r1)*0.30)^2
        + ((g2-g1)*0.59)^2
        + ((b2-b1)*0.11)^2
    

    여기 참고 (C 번호 등) 많은 C-구문 기반의 프로그래밍 언어에서, ^하지 않습니다 평균 "의 힘으로 인상"이 아니라 "독점 또는 이진".

    이 C #을했다 그래서, 당신은 그 부분을 계산하는 Math.Pow를 사용하거나 확장하여 곱셈을 할 것입니다.

    추가 : 위키 백과의 색상 차이에 페이지에서 판단, 지각 차이를 처리하려고 여러 가지 기준이있다. 예를 들어, CIE94라는 사람은 * C * H 색상 모델 그것의 가치가 같은 외모를 조사하는 L에서, 다른 공식을 사용하지만 당신이 원하는 방법을 정확하게에 따라 달라집니다.

  2. ==============================

    2.다음은 당신이 무엇을 설명 정확히 수행합니다

    다음은 당신이 무엇을 설명 정확히 수행합니다

    select (abs(my_R - t.r) + abs(my_G - t.g) + abs(my_B - t.b)) / 3 as difference, t.*
    from RGBtable t
    order by difference desc;
    

    그러나 비선형이었다 뭔가 더 나은 결과를 얻을 수 있습니다. 은 "평균값을"접근 방식에서, 목표 색상 인 경우 (25, 25, 25) 색상 (45, 25, 25) 가까이 (35, 35, 35)보다 더 될 것입니다. 그러나, 나는 그것은 또한 회색 것이기 때문에 두 번째는 실제로 가까이 볼 것 내기.

    몇 가지 아이디어가 마음에 와서 : 당신은 당신이 그들을 평균 전에 차이를 제곱 시도 할 수 있습니다. 아니면 다른 값 사이의 가장 가까운 비율로 색을 찾는 복잡한 일을 할 수 있습니다. (내가 바로 조건을 기억하고있어 경우에 ...) 가장 가까운 비율을 찾는 것은 당신에게 올바른 색상에 가장 가까운 얻을 것입니다,하지만 포화를 고려하지 않습니다

  3. ==============================

    3.유클리드 거리 차이 = SQRT (SQR (red1라고 - red2) + SQR (녹차 1 - green2) + SQR (blue1 - blue2))은 표준 방법은 두 가지 색상의 유사성을 판정한다.

    유클리드 거리 차이 = SQRT (SQR (red1라고 - red2) + SQR (녹차 1 - green2) + SQR (blue1 - blue2))은 표준 방법은 두 가지 색상의 유사성을 판정한다.

    간단한 목록에 색상이 경우, 다음 가장 가까운 색은리스트에있는 모든 색상으로 새로운 색상의 거리를 계산 필요 찾을 수 있습니다. 이것은 O (n)를 연산한다.

    SQRT ()는 비용이 많이 드는 작업입니다, 당신은 두 거리를 비교하는 경우 다음 단순히 SQRT를 생략 할 수 있습니다 ().

    당신은 색상의 매우 큰 팔레트가있는 경우, 그것은 계산 필요 diffreences의 수를 줄이기 위해 이렇게 같은 KD 트리 (또는 대안 중 하나)에 색상을 구성 할 가능성이 빠릅니다.

  4. ==============================

    4.데이터베이스가 당신을 위해 그것을하자 :

    데이터베이스가 당신을 위해 그것을하자 :

    select top 1
      c.r,
      c.b,
      c.g
    from
      color c
    order by
      (square(c.r - @r) + square(c.g - @g) + square(c.b - @b))
    

    @r, @g 및 @b는 색상의 R, G, B 값입니다 어디 그것에 대해 당신이있는 거 검색 (SQL Server 매개 변수 구문, 데이터베이스를 지정하지 않았기 때문에). 참고이 여전히에서 함수 호출을 가지고에 의해 순서 때문에 테이블 스캔을해야 할 것입니다있다.

    그것은 단순 기능이기 때문에 여분의 제곱근 호출이 실제로 필요하지 않습니다. 아마 아주 많이,하지만 여전히 중요한 것하지 않는 것이.

  5. ==============================

    5.색상 차이에 대한 위키 백과 페이지보고에서, 아이디어는 세 가지 차원에서 점으로 RGB 색상을 치료하는 것입니다. 두 가지 색의 차이는, 두 지점 사이의 거리와 동일하다 :

    색상 차이에 대한 위키 백과 페이지보고에서, 아이디어는 세 가지 차원에서 점으로 RGB 색상을 치료하는 것입니다. 두 가지 색의 차이는, 두 지점 사이의 거리와 동일하다 :

    difference = sqrt((red1 - red2)^2 + (green1 - green2)^2 + (blue1 - blue2)^2)
    
  6. ==============================

    6.더 나은 평균보다 한 단계는 가까운 제곱근이다 :

    더 나은 평균보다 한 단계는 가까운 제곱근이다 :

    ((delta red)^2 + (delta green)^2 + (delta blue)^2)^0.5
    

    이 3 차원 색 공간에서의 거리를 최소화 할 수 있습니다.

    루트가 엄격하게 증가하고 있기 때문에, 대신 광장의 최대 검색 할 수 있습니다. 당신이 사용중인 RDBMS하는에 따라 달라집니다 SQL에 표현하는 방법.

  7. ==============================

    7.모두 평균과 같은 거리를 계산한다 :

    모두 평균과 같은 거리를 계산한다 :

    (r + g + b) / 3 = average
    (r - average) + (g - average) + (b - average) = distance
    

    이것은 당신에게 가장 가까운 값의 좋은 아이디어를 줄 것이다.

  8. ==============================

    8.전체 컬러 목록에 컬러 샘플을 비교 할 때마다 아마 최적되지 않습니다. 이것은 탐색 트리에 색상 목록에서 색상을 넣어 최적화 할 수 있습니다. 당신은 빨강, 녹색, 파랑 (RGB) 값의 색상 샘플을 비교하는 경우, 당신은 세 가지 차원 탐색 트리에 색상 목록에서 색상을 넣어 것입니다. 검색 나무는 한 번 생성하고 (JSON, XML) 파일이나 데이터베이스에 저장 될 수있다. 속도는, 예를 들어, 중요한 경우이 가치가에게 그것을 할 수있다 비교하는 많은 포인트가 있습니다.

    전체 컬러 목록에 컬러 샘플을 비교 할 때마다 아마 최적되지 않습니다. 이것은 탐색 트리에 색상 목록에서 색상을 넣어 최적화 할 수 있습니다. 당신은 빨강, 녹색, 파랑 (RGB) 값의 색상 샘플을 비교하는 경우, 당신은 세 가지 차원 탐색 트리에 색상 목록에서 색상을 넣어 것입니다. 검색 나무는 한 번 생성하고 (JSON, XML) 파일이나 데이터베이스에 저장 될 수있다. 속도는, 예를 들어, 중요한 경우이 가치가에게 그것을 할 수있다 비교하는 많은 포인트가 있습니다.

  9. from https://stackoverflow.com/questions/1847092/given-an-rgb-value-what-would-be-the-best-way-to-find-the-closest-match-in-the-d by cc-by-sa and MIT license