Comparing Images MSE and Structual Similarity
Mean Squared Error (MSE)?
두 이미지 간의 MSE는 두 이미지 간의 차이 제곱의 합이다. 이는 numpy로 쉽게 구현할 수 있다.
유사한 이미지 일수록 MSE가 낮다
def mse(image1, image2):
# Images must be of the same dimension
error = np.sum((image1.astype("float") - image2.astype("float")) ** 2)
error /= float(image1.shape[0] * image1.shape[1])
return error
mse를 구하는 공식을 대입한 코드를 함수로 만들어 선언했다.
비교를 하기위해서 불꽃놀이 두개의 사진과
하나는 불꽃놀이1의 밝기를 100 올린 이미지를 준비했다.
M = np.ones(fireworks1.shape, dtype = "uint8") * 100
fireworks1b = cv2.add(fireworks1, M)
해당 이미지를 비교하기 위한 함수도 만들어준다.
def compare(image1, image2):
image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
print('MSE = {:.2f}'.format(mse(image1, image2)))
print('SS = {:.2f}'.format(structural_similarity(image1, image2)))
인자에 들어온 이미지를 비교해서
MSE 값과 구조적 유사성 정도를 계산해서 출력해주는 함수이다.
fireworks1
increasing brightness image = fireworks1b
fireworks2
3개를 비교한 결과이다.
첫번째 같은것을 비교한것을 보았을때 MSE = 0, SS = 1.0 으로
두 이미지가 매우 유사하고 구조적 유사성정도도 100% 다. 로 해석할수있다.
보통 불꽃놀이 두개를 비교했을땐, MSE는 큰편으로 비슷한 사진은 아니지만
48% 정도 구조적 유사성 정도를 보이는것으로 보아 비슷한 사진임을 알려주고있다.
세번째와 네번째를 보았을때 하나하나만 보았을때에는 이해가 어렵지만,
원본 사진과 밝기만 올린 사진의 비교값과
불꽃놀이2와 밝기를 올린 사진의 비교값을 보면 이해가 쉽다.
굉장이 간단하지만 실용적인 기능이다.