# -*- coding: utf-8 -*- """ Created on Sat Mar 26 17:08:00 2022 @author: Kenan """ import cv2 as cv import numpy as np from matplotlib import pyplot as plt path = r"U:\images_input\image.png" def convert_rgb_to_grayscale_average(image_b, image_g, image_r): """This function converts the RGB image into an grayscale image. Algorithm: Average: Y = (R+G+B)/3""" image_r = image_r.astype(np.uint16) #sporadische lösung. umwandlung vor addition, damit keine gehler weil uint8 --> overflow image_g = image_g.astype(np.uint16) image_b = image_b.astype(np.uint16) image_gray = (image_b+image_g+image_r)/3 image_gray = image_gray.astype(np.uint8) return image_gray def convert_rgb_to_grayscale_average_v2(image_b, image_g, image_r): """This function converts the RGB image into an grayscale image. Algorithm: Average: Y = (R+G+B)/3""" image_gray = 1/3*image_r + 1/3*image_g + 1/3*image_b # automatically converts into float64 image_gray = image_gray.astype(np.uint8) return image_gray image_bgr = cv.imread(path, cv.IMREAD_COLOR) # load original image image_b,image_g,image_r = cv.split(image_bgr) # Split colour channels and get grayscale images image_grayscale_avg = convert_rgb_to_grayscale_average(image_b, image_g, image_r) plt.imshow(image_grayscale_avg, cmap = 'gray') image_grayscale_avg_v2 = convert_rgb_to_grayscale_average_v2(image_b, image_g, image_r) # new alrorithm, cleaner # Test if both are same res = np.all(image_grayscale_avg_v2==image_grayscale_avg) print(res) # False # Explanation: # row = 227, col = 7 : r=2, g=10, b=0 # opt1: (r+g+b)/3 = 12/3 = 4 -->int = 4 # v2: 1/3*2 +1/3*10 + 1/3*0 = 0.6666+3.3333 = 3.9999 -->int = 3 --> FALSE # conclusion: opt 1 is better