本文主要是介绍opencv python 删除彩色图片中的斑块,GIS:删除栅格中的小面积斑块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
opencv python 删除彩色图片中的斑块,GIS:删除栅格中的小面积斑块
栅格地图中总有一些细碎的小斑块,写一下代码可以把这些小斑块删除。希望可以帮助有需要的人,同时也做个笔记!效果如图,这是我设置小于300像素的斑块被删除的结果
具体思路如下:
1、首先读入彩色图片,然后转为灰度图片;原始图片
灰度图
2、sobel算子监测边缘,接着用连通区分析找出,小面积斑块的边缘;(说明一下:在上一步过程中我发现并没有找到小面积斑块,而是找到了小面积斑块的边缘轮廓)因此在第三步还需要将小面积斑块进行填充 。
边缘检测后进行连通性分析的结果
3、将上一步结果二值化,然后找到斑块的边缘,对斑块进行填充,得到最终的mask,用于下一步的图像修复。
填充
4、修复数据,用cv2.inpaint()
最终结果
import numpy as np
import cv2imgfile = r"F:\cartography\0524data\dataFromLv\America\ca_kr_300.png"
#函数中的第二个形参是一个数值,面积小于该数值的斑块会被删除
def remove_small_area(imgfile,area_name):#读取图像img = cv2.imread(imgfile)img = cv2.medianBlur(img, 5)#将图像转为灰度图像img_gray= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#sobel算子监测边缘x_gray = cv2.Sobel(img_gray, cv2.CV_32F, 1, 0)y_gray = cv2.Sobel(img_gray, cv2.CV_32F, 0, 1)x_gray = cv2.convertScaleAbs(x_gray)y_gray = cv2.convertScaleAbs(y_gray)dst = cv2.add(x_gray, y_gray, dtype=cv2.CV_16S)dst = cv2.convertScaleAbs(dst)#连通区域分析num_labels, labels, stats, centers = cv2.connectedComponentsWithStats(dst, connectivity=8, ltype=cv2.CV_32S)# 参数说明:# num_labels: 代表连通域的数量,包含背景# labels : 记录img中每个位置对应的label# stats: 每个连通域的外接矩形和面积# x, y, w, h, area = stats[t]# centers : 连通域的质心坐标for t in range(1, num_labels, 1):x, y, w, h, area = stats[t]if area > area_name:index = np.where(labels == t)labels[index[0], index[1]] = 0# 把斑点位置保存在mask中,The mask must be 8-bit 1-channel image in function 'icvInpaint'mask = np.array(labels, np.uint8)#将mask二值化,由于现在的mask只有轮廓,所以要将轮廓内部填充ret, thresh = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY)#找到最外层轮廓,该方法的第二个参数就是找最外层轮廓contours, hierachy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, 1)#填充result = cv2.fillPoly(thresh, contours, (255, 255, 255))#修复图像,mask地方的像素值由周围的像素值决定dst_TELEA = cv2.inpaint(img, result, 3, cv2.INPAINT_TELEA)#绘制最终结果cv2.imshow('result', dst_TELEA)cv2.waitKey(0)remove_small_area(imgfile,300)
参考大佬的博客:
https://blog.csdn.net/galen_xia/article/details/107631300
https://blog.csdn.net/luanfenlian0992/article/details/110529737?ydreferer=aHR0cHM6Ly9jbi5iaW5nLmNvbS8%3D
这篇关于opencv python 删除彩色图片中的斑块,GIS:删除栅格中的小面积斑块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!