컴퓨터 비전의 몇 가지 고전적인 알고리즘 - 최소 제곱법 + RANSAC + 해시 알고리즘(DCT 포함) + 이미지 클러스터링 알고리즘

컴퓨터 비전의 몇 가지 고전적인 알고리즘

1. 최소자승법(선형회귀함수 구하기)

최소 제곱법을 이해하기 전에 선형 회귀에 대해 이야기해야 합니다.소위 선형 회귀의 가장 일반적인 예는 y=2x입니다.단항 선형 회귀 방정식에서 기울기 2는 회귀 계수입니다.해당 관계 및 선형 회귀는 일부 불연속 점이 일반적으로 특정 직선에 가장 가깝다는 것을 의미합니다.

이것이 최소 제곱과 어떤 관련이 있습니까? 사실 최소자승법(Least Square Method)은 오차의 제곱합을 최소화하여 구하는 선형회귀함수를 찾는 방법인데 왜 잔차의 제곱합을 사용할까요? 피팅도가 높기 때문에, 즉 피팅 함수와 해결하려는 함수의 y 사이의 유사도가 더 높음

미지의 데이터는 최소자승법을 이용하여 쉽게 구할 수 있으며, 얻은 데이터와 실제 데이터의 오차 제곱합을 최소화할 수 있다.

여기에 이미지 설명 삽입

2. RANSAC(알려진 모델, 알려지지 않은 매개변수)

RANSAC, 즉 랜덤 샘플링 일관성, 방법이나 알고리즘이 아니라 아이디어, 알려진 모델의 매개 변수를 해결하기 위한 프레임워크, 특정 문제를 제한하지 않음, 컴퓨터 비전의 문제일 수 있음, 또는 그것은 통계수학이고, 심지어 경제학 분야에서 모델 매개변수의 추정 문제가 될 수도 있습니다.

일련의 개별 관측 데이터에서 수학적 모델의 매개변수를 추정 하는 반복적인 방법이며, 특정 확률에서 합리적인 결과를 생성하는 비결정론적 알고리즘이므로 더 많은 반복을 사용하여 확률을 높일 수 있습니다.

RANSAC의 기본 가정은 "내부 그룹" 데이터가 여러 모델 매개변수 집합을 통해 데이터 분포를 설명할 수 있는 반면 "이상치" 데이터는 모델링에 적합하지 않은 데이터라는 것입니다. 데이터는 노이즈의 영향을 받을 수 있습니다. 노이즈는 극심한 노이즈, 측정값의 잘못된 해석 또는 데이터에 대한 잘못된 가정과 같은 이상값을 나타냅니다.

RANSAC은 (일반적으로 작은) 그룹 내 세트가 주어지면 데이터 모델을 가장 잘 설명하거나 가장 잘 맞는 매개변수를 추정할 수 있는 절차가 있다고 가정합니다.

2.1 RANSAC과 최소자승법의 차이점

위의 내용에서 우리는 이 두 가지가 실제로 피팅에 사용된다는 것을 알 수 있습니다. 그러나 이들 사이의 관계는 무엇이며 차이점은 무엇이며 다른 응용 시나리오는 무엇입니까?

실제 개발이나 생산 실무에서는 데이터에 일정한 편차가 있을텐데, 두 변수의 관계가 선형회귀함수인 Y=aX+b임을 알 때, a와 b의 구체적인 값을 알고자 한다면, Theory 요구사항을 충족시키기 위해서는 두 개의 점만 있으면 된다고 하는데, 오차가 존재하기 때문에 임의로 선택한 두 점에서 얻은 a와 b가 다를 수 있습니다. 테스트 값의 오차가 가장 작음

  • 최소자승법 : a와 b의 편도함수에 대한 최소평균제곱오차의 값이 0일 때 계산하여 최소자승법은 많은 경우 선형회귀와 동의어가 되지만 오차가 작은 경우에만 적합하다.
  • RANSAC: 모델이 결정되고 최대 반복 횟수가 허용되면 RANSAC은 항상 최적의 솔루션을 찾을 수 있습니다.

정리하면 오차가 작고 RANSAC을 사용하는 경우와 오차가 약간 크고 최대 반복 횟수가 허용되는 경우에 최소자승법이 적합하다고 일방적으로 생각할 수 있다. 이미지 처리의 실제 발전은 사진의 픽셀 수가 많기 때문에 최소 제곱법을 사용하면 계산량이 많고 계산 속도가 매우 느립니다.

2.2 RANSAC 알고리즘의 단계

RANSAC 알고리즘의 입력 데이터: 관찰 데이터의 집합이며 RANSAC의 고유성으로 인해 일반적으로 이러한 관찰 데이터에는 큰 노이즈와 유효하지 않은 점이 있습니다.관측 데이터 외에도 RANSAC에는 알려진 모델이 필요합니다. (함수로 이해됨) 일부 신뢰할 수 있는 매개변수도 중요합니다.

RANSAC 알고리즘의 구현 과정에서 대략 6단계로 나눌 수 있습니다.

  1. 입력 데이터에서 임의로 여러 포인트를 선택하여 노이즈 포인트와 무효 포인트 이외의 유효 포인트인 내군으로 설정
  2. 적합한 내부 그룹의 모델을 계산하고 RANSAC 알고리즘에 입력 데이터로 전달
  3. 설정한 모델에 방금 선택하지 않은 다른 포인트를 도입하여 내부 그룹인지 계산
  4. 그룹 내 수를 기록하고 위의 단계를 반복합니다.
  5. 인그룹 수를 계산하는 각 과정에서 인그룹 수가 가장 많은 모델을 선택하고 인그룹 수가 가장 많은 모델이 우리가 필요로 하는 결과입니다.

RANSAC 알고리즘을 실행하는 과정에서 수학적 모델이 다르면 매개변수 모델을 계산하는 방법도 달라야 하므로 RANSAC은 계산 모델의 매개변수를 찾아주는 것이 아니라 그러한 아이디어를 제공하는 것이다.

RANSAC의 가장 큰 결함은 수학적 모델을 알아야 한다는 점입니다.

알고리즘 실행 과정에서 우리는 두 가지 문제에 주의를 기울여야 합니다: 1. 처음에 몇 개의 포인트를 내부 그룹으로 선택해야 합니까? 2. 최대 반복 횟수는 얼마입니까?

2.3 RANSAC의 파라미터 결정

1단계에서 선택한 포인트가 내군일 확률이 w이고, 선택된 포인트의 개수가 n개라고 가정하면, w^n은 선택된 n개의 포인트가 모두 내군일 확률이고, 1-w^n은 선택된 n개의 포인트 중 적어도 하나가 그룹 내 그룹이 아닐 확률이 있습니다 . 알고리즘을 k번 실행한 후의 성공 확률은 p이며 p의 계산 공식을 얻을 수 있습니다. p = 1 − (1 − w^n)k

그런 다음 위 공식을 사용하여 k의 계산 공식을 얻습니다. K=log(1-P)/log(1-w^n)

이 두 함수를 통해 우리가 만들고자 하는 모델이 최적해가 될 확률이 높을수록 w가 결정될 때 k가 클수록 p가 커진다는 것을 알 수 있습니다. w가 일정할 때 n이 클수록 더 큰 k가 필요하지만 일반적으로 w는 위치적이므로 n을 더 작게 선택합니다.

2.4 RANSAC의 적용

RANSAC의 가장 일반적인 적용 시나리오는 파노라마 스티칭 이며 구현 프로세스는 크게 4단계로 나뉩니다.

  1. 한 장면에 대해 일반적으로 순서대로 여러 이미지를 찍습니다.
  2. SIFT(Feature Matching)를 통해 다음 사진과 이전 사진 간의 변환 구조 계산
  3. 이미지 매핑, 다음 이미지를 이전 이미지의 좌표계에 중첩
  4. 변환된 이미지는 함께 융합되어 최종 파노라마를 얻습니다.

여기에 이미지 설명 삽입

2.5 RANSAC 알고리즘의 장점과 단점

장점: 장점은 기능, 즉 최적의 계산 모델을 찾을 수 있다는 것입니다.

단점: 많은 제한 사항으로 인해 단점도 매우 분명합니다.

  • 매개변수를 계산하는 반복 횟수에는 상한이 없으며 반복 횟수의 상한을 설정하면 얻은 결과가 최적의 결과가 아닐 수 있으며 잘못된 결과를 얻을 수도 있습니다.
  • RANSAC은 신뢰할 수 있는 모델을 얻을 수 있는 특정 확률만 있으며 그 확률은 반복 횟수에 비례합니다.
  • 문제와 관련된 임계값 설정이 필요합니다.
  • RANSAC은 특정 데이터 세트에서 하나의 모델만 추정할 수 있으며, 두 개 이상의 모델이 있는 경우 RANSAC은 다른 모델을 찾을 수 없습니다.
  • 수학적 모델을 알아야 합니다.

3. 해시 알고리즘

해쉬알고리즘은 RANSAC과 최소자승법과는 무관한 또 다른 알고리즘으로 컴퓨터 비전 분야에서는 이미지 유사도 비교에 자주 사용된다. aHash), 차이 해싱 알고리즘(dHash) 및 인지적 해싱 알고리즘(pHash)

해시 알고리즘에 관해서는 해시 함수에 대해 이야기해야 합니다. 모든 종류의 데이터에서 작은 디지털 "지문"을 만드는 방법입니다. 메시지 또는 데이터를 요약으로 압축하여 데이터의 양을 더 작게 만듭니다. , 그리고 데이터의 형식이 고정되면 이 기능은 데이터를 뒤섞어 해시 값이라는 지문을 다시 생성합니다. 이 지문은 일반적으로 임의의 문자와 숫자의 짧은 문자열로 표시됩니다.

해시 알고리즘에 의해 얻어진 임의의 길이의 이진 값은 더 짧은 고정 길이의 이진 값, 즉 해시 값으로 매핑된다. 또한, 해시값은 데이터 조각을 독특하고 매우 간결하게 표현한 것으로, 평문 조각을 해싱하여 해시값을 얻으면 평문 조각의 어떤 문자만 변경해도 결과로 나온 해시값이 해시 알고리즘은 거의 모든 디지털 파일을 숫자와 문자로 이루어진 왜곡된 문자열로 변환하는 기능입니다 .

암호화 기능으로서 해시 기능에는 두 가지 가장 중요한 특징이 있습니다 .

  • 비가역성 , 입력 정보에서 왜곡된 문자열(해시 값) 출력을 얻는 것은 매우 쉽지만 출력 문자열에서 입력 결과를 추론하는 것은 매우 어렵습니다.
  • 출력 값의 고유성과 예측 불가능성 입력 정보가 ​​약간 다른 한 해시 알고리즘에 따라 얻은 출력 값도 매우 다릅니다.

해밍 거리

해밍 거리는 두 해시 값의 근접성을 비교하는 데 사용되는 측정값으로, 두 숫자가 이진 차이에 해당하는 위치의 수를 나타냅니다.

3.1 평균 해시 알고리즘과 차분 해시 알고리즘

평균값 해싱 알고리즘의 프로세스는 6단계로 나뉩니다.

  1. 크기 조정: 그림의 크기는 8*8로 조정되고 구조는 유지되며 세부 사항은 제거됩니다.
  2. 그레이스케일: 그레이스케일 이미지로 변환
  3. 평균: 그레이스케일 이미지의 모든 픽셀의 평균을 계산합니다.
  4. 비교: 픽셀 값이 평균값보다 크면 1로 기록하고 그렇지 않으면 0으로 기록하여 총 64비트
  5. 해시 생성: 위의 단계에서 생성된 1과 0을 순서대로 조합하면 사진의 지문(해시)이 됩니다.
  6. 지문 비교: 두 사진의 지문을 비교하여 Hamming 거리, 즉 두 개의 64비트 해시 값 중 몇 비트가 다른지 계산합니다. 다른 비트가 적을수록 사진이 더 유사합니다.

차이해시알고리즘은 기본적으로 처리 초기와 후기의 평균해시알고리즘과 동일하나, 해시를 비교할 때 차이점이 있으며, 차이해시알고리즘은 6단계로 나누어진다.

  1. 크기 조정: 그림의 크기는 8*9 로 조정되고 구조는 유지되며 세부 정보는 제거됩니다.
  2. 그레이스케일: 그레이스케일 이미지로 변환
  3. 비교: 픽셀 값이 다음 픽셀 값보다 크면 1로 기록되고 그렇지 않으면 0으로 기록됩니다. 이 라인은 다음 라인과 비교되지 않으며, 각 라인은 9개의 픽셀, 8개의 차이, 8개의 라인, 총 64비트
#均值哈希算法
def aHash(img):
    #缩放为8*8
    img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)
    #转换为灰度图
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #s为像素和初值为0,hash_str为hash值初值为''
    s=0
    hash_str=''
    #遍历累加求像素和
    for i in range(8):
        for j in range(8):
            s=s+gray[i,j]
    #求平均灰度
    avg=s/64
    #灰度大于平均值为1相反为0生成图片的hash值
    for i in range(8):
        for j in range(8):
            if  gray[i,j]>avg:
                hash_str=hash_str+'1'
            else:
                hash_str=hash_str+'0'           
    return hash_str
  
#差值感知算法
def dHash(img):
    #缩放8*9
    img=cv2.resize(img,(9,8),interpolation=cv2.INTER_CUBIC)
    #转换灰度图
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    hash_str=''
    #每行前一个像素大于后一个像素为1,相反为0,生成哈希
    for i in range(8):
        for j in range(8):
            if   gray[i,j]>gray[i,j+1]:
                hash_str=hash_str+'1'
            else:
                hash_str=hash_str+'0'
    return hash_str

3.2 이산 코사인 변환 DCT 및 지각 해시 알고리즘

위에서 3개의 해시 알고리즘이 있다고 말했지만 그중 2개만 언급했습니다.

평균 해싱 알고리즘은 너무 엄격하고 정확하지 않기 때문에 썸네일 검색에 더 적합합니다.보다 정확한 결과를 얻으려면 DCT(이산 코사인 변환)를 사용하여 빈도를 줄이는 지각 해싱 알고리즘을 선택할 수 있습니다. 8단계에 대한 인지적 해싱 알고리즘 포인트:

  1. 사진 축소: 32 * 32는 DCT 계산에 편리한 더 나은 크기입니다.
  2. 회색조로 변환: 크기 조정된 이미지를 회색조로 변환합니다.
  3. DCT 계산: DCT는 사진을 일련의 비율로 분리합니다.
  4. 감소된 DCT: DCT 계산 후 매트릭스는 32 * 32이고 왼쪽 상단 모서리의 8 * 8은 예약되어 있으며 이는 그림의 가장 낮은 주파수를 나타냅니다.
  5. 평균 계산: DCT 감소 후 모든 픽셀의 평균 계산
  6. DCT를 더 줄입니다. 평균값보다 크면 1로 기록되고 그렇지 않으면 0으로 기록됩니다.
  7. 정보 지문 얻기: 64개의 정보 비트를 결합하고 순서는 일관성을 유지하기 위해 무작위입니다.
  8. 마지막으로 두 사진의 지문을 비교하여 해밍 거리를 구합니다.

이산 코사인 변환(Discrete Cosine Transform) 주로 데이터나 이미지를 압축하는데 사용되며 공간 영역 신호를 주파수 영역으로 변환할 수 있고 역상관 성능이 좋으며 DCT 변환 자체는 손실이 없으며 동시에 DCT로 인해 변환이 대칭적임 , 그래서 우리는 양자화 및 코딩 후 DCT 역변환을 사용하여 수신단에서 원래 이미지 정보를 복원할 수 있습니다.DCT 변환은 현재 이미지 분석 및 압축 분야에서 매우 광범위하게 사용됩니다.우리의 일반적인 JPEG 정적 이미지 코딩 DCT 변환은 MJPEG 및 MPEG 동적 코딩과 같은 표준에 사용

제가 이 부분에 대해 잘 모르기 때문에 먼저 이론적인 부분만 말씀드릴 수 있고 기회가 되면 자세히 말씀드리겠습니다.

4. 이미지 클러스터링 알고리즘 K-Means

4.1 분류 및 클러스터링

분류

분류는 실제로 특정 데이터에서 패턴을 발굴하고 판단하는 과정이며 분류 학습의 주요 과정은 세 단계로 나눌 수 있습니다.

  1. training data set에 class label number가 있어 positive data set인지 negative data set인지 판단
  2. 그런 다음 데이터 세트를 학습 및 훈련하고 훈련된 모델을 구축해야 합니다.
  3. 모델을 통해 설정된 예측 데이터에 대한 예측을 수행하고 그 결과의 성능을 계산합니다.

클러스터링

넓은 의미에서 클러스터링은 어떤 측면에서 유사한 데이터 세트의 데이터 구성원을 함께 모으는 것입니다. 클러스터는 동일한 클러스터의 데이터 요소가 서로 유사하지만 다른 클러스터에 있는 데이터 인스턴스의 모음입니다. 의 요소는 서로 다릅니다.

클러스터링에는 데이터 카테고리를 나타내는 분류나 그룹화 정보가 없기 때문에, 즉 이러한 데이터는 레이블이 없기 때문에 일반적으로 클러스터링은 비지도 학습으로 분류됩니다.

클러스터링의 목적도 데이터를 분류하는 것인데, 데이터를 어떻게 분류해야 할지 미리 알지 못하고, 데이터 조각들 사이의 유사성을 판단하고 유사한 것들을 하나로 묶는 것은 전적으로 알고리즘 자체다. 클러스터링 결론이 나오기 전에는 각 카테고리의 특성을 전혀 모르기 때문에 클러스터링된 카테고리가 어떤 특성을 가지고 있는지 인간의 경험을 통해 클러스터링 결과를 분석해야 합니다.

즉, 클러스터링은 주로 유사성을 통해 유사한 요소를 함께 모으는 "함께 클러스터링과 유사"하며 레이블이 없습니다.

4.2 K-평균 클러스터링

K-Means 클러스터링은 가장 일반적으로 사용되는 클러스터링 알고리즘으로 신호 처리에서 유래되었으며 데이터 포인트를 K 개의 클러스터로 나누는 것이 목표입니다.이 알고리즘의 가장 큰 장점은 간단하고 이해하기 쉽고 빠른 연산입니다. 단점 은 클러스터링 하기 전에 클러스터 수를 지정해야 한다는 점 이 알고리즘의 가장 큰 장점 간단하고 이해하기 쉬우며 연산 속도가 빠르다는 점 단점 클러스터링 전 클러스터 수.

K-Means 클러스터링 알고리즘 분석 과정

첫 번째 단계: K 값 결정, 즉 데이터 세트를 K 클러스터 또는 그룹으로 나눕니다.

2단계: 데이터 세트에서 K개의 데이터 포인트를 중심(Centroid) 또는 데이터 센터로 무작위로 선택합니다.

3단계: 각 점에서 각 중심까지의 거리를 개별적으로 계산하고 각 점을 가장 가까운 중심 그룹으로 나눕니다.

4단계: 각 중심이 일부 포인트를 수집하면 알고리즘을 재정의하여 새 중심을 선택합니다(각 클러스터에 대해 평균을 계산합니다. 즉, 새로운 k 중심 포인트를 얻습니다).

5단계: 반복이 종료되거나 반복 종료 조건이 충족될 때까지 3단계와 4단계를 반복 수행(클러스터링 결과는 변경되지 않음)

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
#读取原始图像
img = cv2.imread('lenna.png') 
print (img.shape)
 
#图像二维像素转换为一维
data = img.reshape((-1,3))
data = np.float32(data)
 
#停止条件 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +
            cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
 
#设置标签
flags = cv2.KMEANS_RANDOM_CENTERS
 
#K-Means聚类 聚集成2类
compactness, labels2, centers2 = cv2.kmeans(data, 2, None, criteria, 10, flags)
 
#K-Means聚类 聚集成4类
compactness, labels4, centers4 = cv2.kmeans(data, 4, None, criteria, 10, flags)
 
#K-Means聚类 聚集成8类
compactness, labels8, centers8 = cv2.kmeans(data, 8, None, criteria, 10, flags)
 
#K-Means聚类 聚集成16类
compactness, labels16, centers16 = cv2.kmeans(data, 16, None, criteria, 10, flags)
 
#K-Means聚类 聚集成64类
compactness, labels64, centers64 = cv2.kmeans(data, 64, None, criteria, 10, flags)
 
#图像转换回uint8二维类型
centers2 = np.uint8(centers2)
res = centers2[labels2.flatten()]
dst2 = res.reshape((img.shape))
 
centers4 = np.uint8(centers4)
res = centers4[labels4.flatten()]
dst4 = res.reshape((img.shape))
 
centers8 = np.uint8(centers8)
res = centers8[labels8.flatten()]
dst8 = res.reshape((img.shape))
 
centers16 = np.uint8(centers16)
res = centers16[labels16.flatten()]
dst16 = res.reshape((img.shape))
 
centers64 = np.uint8(centers64)
res = centers64[labels64.flatten()]
dst64 = res.reshape((img.shape))
 
#图像转换为RGB显示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst2 = cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB)
dst4 = cv2.cvtColor(dst4, cv2.COLOR_BGR2RGB)
dst8 = cv2.cvtColor(dst8, cv2.COLOR_BGR2RGB)
dst16 = cv2.cvtColor(dst16, cv2.COLOR_BGR2RGB)
dst64 = cv2.cvtColor(dst64, cv2.COLOR_BGR2RGB)
 
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
 
#显示图像
titles = [u'原始图像', u'聚类图像 K=2', u'聚类图像 K=4',
          u'聚类图像 K=8', u'聚类图像 K=16',  u'聚类图像 K=64']  
images = [img, dst2, dst4, dst8, dst16, dst64]  
for i in range(6):  
   plt.subplot(2,3,i+1), plt.imshow(images[i], 'gray'), 
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()

K-Means 클러스터링 및 이미지 처리

이미지 처리 중국에서는 K-Means 클러스터링 알고리즘을 통해 이미지 분할, 이미지 클러스터링 및 이미지 인식을 실현할 수 있습니다.이 픽셀을 알고리즘을 통해 K 클러스터로 클러스터링 한 다음 각 클러스터 포인트의 중심을 사용하여 모든 해상도를 변경하지 않고 이미지 색상을 양자화 및 압축할 수 있도록 클러스터의 픽셀, 이미지 색상 레벨 분할을 실현할 수 있습니다.

이미지 처리 적용에 있어서 K-Means 클러스터링은 분명한 장점이 있는데, 우리의 신경망만큼 효과가 좋지는 않지만 일반적인 경우에는 충분하고 간단하고 빠르며 대용량 데이터를 처리하는 알고리즘입니다. 세트가 매우 효율적이고 높으며 결과 클러스터가 밀집된 경우 효과가 매우 이상적입니다.

단점 중 하나는 클러스터 수 K를 바로 지정해야 한다는 점과 다른 하나는 노이즈 및 이상치 데이터에 민감하다는 점입니다. 이러한 결함은 일반적인 문제를 처리할 때 다른 방법으로 보완할 수 있습니다.


저작권 진술: 위의 학습 콘텐츠 및 사진은——Badou 인공 지능 Wang Xiaotian에서 가져오거나 참조합니다
. 기사가 도움이 되었다면 한 번의 클릭으로 지원하는 것을 잊지 마십시오~

추천

출처blog.csdn.net/qq_50587771/article/details/124433952