遥感影像简易云判功能实现

May 14,2018   1937 words   7 min


遥感影像云判简单来说就是判定一幅遥感影像中被云覆盖的部分所占的比例。 云判是遥感影像生产必不可少的环节之一,其也是判断一幅遥感影像质量的标准之一。 下面利用Python和OpenCV简单实现了影像云判功能。 简单来说就是逐像素对影像进行灰度统计,如果某个像素灰度值大于指定阈值,则认为该像素是云。 对于彩色图像来说则分别判断3个通道即可,若3通道数据同时都大于阈值,则认为该点是云(接近白色)。 当然由于是简易实现,所以缺点也很明显。 那就是只要是白色的物体就有可能被识别成云,这对于那些白色的地物而言就分辨不出来了。 当然,真正的云判需要更加复杂的算法而不是一个简单的for循环加if判断。 但这里只是为了练手和体验下云判的过程,所以简单写了个脚本。

1.代码

# coding=utf-8
import cv2
import sys

THRESHOLD = 230
img_path = ""

if sys.argv.__len__() == 2 and sys.argv[1] == 'help':
    print("This script is for statistic the number of cloud pixels in an image.")
    print("Mode 1:script.py image_name.jpg")
    print("Mode 2:script.py image_name.jpg 240")
    print("230 is selected as default gray scale threshold for cloud if you don't input.")
    exit()
elif sys.argv.__len__() == 2:
    img_path = sys.argv[1]
elif sys.argv.__len__() == 3:
    img_path = sys.argv[1]
    THRESHOLD = int(sys.argv[2])
else:
    script_name = sys.argv[0][sys.argv[0].rfind('/') + 1:]
    print("Input 'python " + script_name + " help'to get help information.")
    exit()

img = cv2.imread(img_path)
if img.shape[2] != 1:
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
else:
    gray_img = img

height = img.shape[0]
width = img.shape[1]
total = width * height

cloud_pixel = 0
print("Image Info:")
print("Image path:" + img_path)
print("Image width:" + width.__str__())
print("Image height:" + height.__str__())
print("Total pixels:" + total.__str__())
print("Gray scale threshold:" + THRESHOLD.__str__())

print("Analyzing...")

for i in range(height):
    for j in range(width):
        if gray_img[i, j] > THRESHOLD:
            cloud_pixel += 1
            img[i, j, 0] = 255
            img[i, j, 1] = 144
            img[i, j, 2] = 30
percentage = cloud_pixel * 1.0 / total
print("Result:")
print("Cloud pixels:" + cloud_pixel.__str__())
print("Cloud percentage:" + (percentage * 100).__str__() + "%")

if height > 900:
    img_resize = cv2.resize(img, None, fx=900.0 / height, fy=900.0 / height, interpolation=cv2.INTER_CUBIC)
else:
    img_resize = img

cv2.imwrite("out.jpg", img_resize)
cv2.imshow("cloud", img_resize)
cv2.waitKey(0)

这里为了简单,不管是不是灰度图像全部转成灰度图像,然后和阈值进行比较。 但其实对于彩色图像可以分别对三个通道进行判断,这样会更加精确些。

2.测试

下面分别利用代码对不同影像进行了云判测试,阈值取为230。 可以看到总体而言效果还是不错的,虽谈不上非常精准,但是也可以大致判断出云的含量。 可以在不用打开影像的情况下大致了解影像信息,提供个参考。

本文作者原创,未经许可不得转载,谢谢配合

返回顶部