To remove the cast of green color, we use the technique of image white balancing. First, we need a reference object with known color. Fortunately this photo has clouds (pointed by the arrow). Clouds are good references since they are white. By averaging the pixels of cloud (mean(img_array[400,500:550,:])), the mean of R/G/B is [201.5, 254.9, 253.9]. Since white color has R/G/B channels roughly equal, to make it white, 52 needs to be added to R channel of the whole image. Like DC cancellation in communication, white balancing removes the bias of the signal.
Code below shows how to do white balancing
filename = 'IMG_9254.JPG' img = image.load_img(filename) img_array = np.array(image.img_to_array(img),dtype=np.uint8) img_shape=img_array.shape plt.figure() plt.imshow(img_array) img_array2 = img_array img_array2 = np.array(img_array2, dtype=np.uint16) img_array2[:,:,0] = img_array2[:,:,0] + 52 # white balancing img_array2 = np.clip(img_array2, 0, 255)
The newly generated image after white balancing, img_array2, is shown below. The color does look more natural. In case that you want to repeat this, code/image can be found here.