[SQL] 데이터베이스에 가장 가까운을 찾을 수있는 가장 좋은 방법 일 것입니다 무슨 RGB 값을 감안할 때?
SQL데이터베이스에 가장 가까운을 찾을 수있는 가장 좋은 방법 일 것입니다 무슨 RGB 값을 감안할 때?
나는 RGB 값을 가지고 내 데이터베이스에 색상 표에 존재하지 않는 경우에 나는 가장 가까운 색을 찾아야합니다. 나는 모든 값을 비교 한 후 평균을 (빨간색, 녹색 및 파란색)의 차이를 찾는 생각했다. 가장 낮은 평균 편차는 가장 가까운 색이어야한다. 더 나은 방법이 있어야한다처럼 나에게 보인다. 어떤 아이디어?
해결법
-
==============================
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.다음은 당신이 무엇을 설명 정확히 수행합니다
다음은 당신이 무엇을 설명 정확히 수행합니다
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.유클리드 거리 차이 = 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.데이터베이스가 당신을 위해 그것을하자 :
데이터베이스가 당신을 위해 그것을하자 :
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.색상 차이에 대한 위키 백과 페이지보고에서, 아이디어는 세 가지 차원에서 점으로 RGB 색상을 치료하는 것입니다. 두 가지 색의 차이는, 두 지점 사이의 거리와 동일하다 :
색상 차이에 대한 위키 백과 페이지보고에서, 아이디어는 세 가지 차원에서 점으로 RGB 색상을 치료하는 것입니다. 두 가지 색의 차이는, 두 지점 사이의 거리와 동일하다 :
difference = sqrt((red1 - red2)^2 + (green1 - green2)^2 + (blue1 - blue2)^2)
-
==============================
6.더 나은 평균보다 한 단계는 가까운 제곱근이다 :
더 나은 평균보다 한 단계는 가까운 제곱근이다 :
((delta red)^2 + (delta green)^2 + (delta blue)^2)^0.5
이 3 차원 색 공간에서의 거리를 최소화 할 수 있습니다.
루트가 엄격하게 증가하고 있기 때문에, 대신 광장의 최대 검색 할 수 있습니다. 당신이 사용중인 RDBMS하는에 따라 달라집니다 SQL에 표현하는 방법.
-
==============================
7.모두 평균과 같은 거리를 계산한다 :
모두 평균과 같은 거리를 계산한다 :
(r + g + b) / 3 = average (r - average) + (g - average) + (b - average) = distance
이것은 당신에게 가장 가까운 값의 좋은 아이디어를 줄 것이다.
-
==============================
8.전체 컬러 목록에 컬러 샘플을 비교 할 때마다 아마 최적되지 않습니다. 이것은 탐색 트리에 색상 목록에서 색상을 넣어 최적화 할 수 있습니다. 당신은 빨강, 녹색, 파랑 (RGB) 값의 색상 샘플을 비교하는 경우, 당신은 세 가지 차원 탐색 트리에 색상 목록에서 색상을 넣어 것입니다. 검색 나무는 한 번 생성하고 (JSON, XML) 파일이나 데이터베이스에 저장 될 수있다. 속도는, 예를 들어, 중요한 경우이 가치가에게 그것을 할 수있다 비교하는 많은 포인트가 있습니다.
전체 컬러 목록에 컬러 샘플을 비교 할 때마다 아마 최적되지 않습니다. 이것은 탐색 트리에 색상 목록에서 색상을 넣어 최적화 할 수 있습니다. 당신은 빨강, 녹색, 파랑 (RGB) 값의 색상 샘플을 비교하는 경우, 당신은 세 가지 차원 탐색 트리에 색상 목록에서 색상을 넣어 것입니다. 검색 나무는 한 번 생성하고 (JSON, XML) 파일이나 데이터베이스에 저장 될 수있다. 속도는, 예를 들어, 중요한 경우이 가치가에게 그것을 할 수있다 비교하는 많은 포인트가 있습니다.
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
'SQL' 카테고리의 다른 글
[SQL] 왜 외래 키에 대한 단방향 one-to-many 연관을 방지하는 것이 좋습니다? [복제] (0) | 2020.06.23 |
---|---|
[SQL] 는 SQL TIMESTAMP 컬럼에 자바 날짜를 작성하기 전에, JDBC는 데이터베이스 세션 시간대에 JVM 시간대에서 날짜를 변환합니까? (0) | 2020.06.23 |
[SQL] MySQL의 쿼리에 일련 번호를 생성 (0) | 2020.06.23 |
[SQL] 구분 위치에 의해 분할 문자열 오라클 SQL을 사용하여 (0) | 2020.06.23 |
[SQL] 패스에서 PostgreSQL을보기로 ""매개 변수? (0) | 2020.06.23 |