1.阈值分割

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
from osgeo import gdal GRAY_SCALE = 256 def tif_jpg(rasterfile):
in_ds = gdal.Open(rasterfile) # 打开样本文件
xsize = in_ds.RasterXSize # 获取行列数
ysize = in_ds.RasterYSize
bands = in_ds.RasterCount
block_data = in_ds.ReadAsArray(0, 0, xsize, ysize).astype(np.float32)
B = block_data[0, :, :] G = block_data[ 1,:, :]
R = block_data[2,:, :]
R1 = (R/np.max(R)*255).astype(np.int16)
G1 = (G / np.max(G) * 255).astype(np.int16)
B1 = (B / np.max(B) * 255).astype(np.int16)
data2 = cv2.merge([R1,G1,B1])
return data2 def write_tiff(path,image_gray,out):
in_ds = gdal.Open(path) # 打开样本文件
xsize = in_ds.RasterXSize # 获取行列数
ysize = in_ds.RasterYSize
bands = in_ds.RasterCount
geotransform = in_ds.GetGeoTransform()
projection = in_ds.GetProjectionRef() driver = gdal.GetDriverByName('GTiff')
outfile = out + "\\" + os.path.basename(path).split(".tif")[0] + "_mask.tif" # 对输出文件命名
out_dataset = driver.Create(outfile, xsize, ysize, 1, gdal.GDT_Float32) # 创建一个一波段的数据框架
out_band1 = out_dataset.GetRasterBand(1)
out_band1.WriteArray(image_gray) out_dataset.SetGeoTransform(geotransform) # 写入仿射变换
out_dataset.SetProjection(projection)
if __name__ == '__main__':
path = r"D:\data\实验数据\3\3.tif"
out = r"D:\data\实验结果" #设置阈值
thresh=40 #tif转jpg并灰度化
img = tif_jpg(path).astype(np.uint8)
image_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
#高斯滤波
img_blur = cv2.GaussianBlur(image_gray , (5, 5), 5)
# 阈值提取
img_blur[img_blur > thresh] = 255
img_blur[img_blur<= thresh] =1
write_tiff(path, img_blur, out)

2.直方图双峰法阈值分割

import os
from osgeo import gdal
import numpy as np
import cv2
GRAY_SCALE = 256 def tif_jpg(rasterfile):
in_ds = gdal.Open(rasterfile) # 打开样本文件
xsize = in_ds.RasterXSize # 获取行列数
ysize = in_ds.RasterYSize
bands = in_ds.RasterCount
block_data = in_ds.ReadAsArray(0, 0, xsize, ysize).astype(np.float32)
B = block_data[0, :, :] G = block_data[ 1,:, :]
R = block_data[2,:, :]
R1 = (R/np.max(R)*255)
G1 = (G / np.max(G) * 255)
B1 = (B / np.max(B) * 255)
data2 = cv2.merge([R1,G1,B1]).astype(np.int16)
return data2 def calcGrayHist(image):
'''
统计像素值
:param image:
:return:
'''
# 灰度图像的高,宽
rows, cols = image.shape
# 存储灰度直方图
grayHist = np.zeros([256], np.uint64)
for r in range(rows):
for c in range(cols):
grayHist[image[r][c]] += 1
return grayHist #直方图全局阈值
def threshTwoPeaks(image): # 计算灰度直方图
histogram = calcGrayHist(image) # 找到灰度直方图的最大峰值对应的灰度值
maxLoc = np.where(histogram == np.max(histogram))
firstPeak = maxLoc[0][0] # 寻找灰度直方图的第二个峰值对应的灰度值
measureDists = np.zeros([256], np.float32)
for k in range(256):
measureDists[k] = pow(k - firstPeak, 3) * histogram[k]#GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
maxLoc2 = np.where(measureDists == np.max(measureDists))
secondPeak = maxLoc2[0][0] if firstPeak > secondPeak:
temp = histogram[int(secondPeak): int(firstPeak)]
minLoc = np.where(temp == np.min(temp))
thresh = secondPeak + minLoc[0][0]+ 1
else:
temp = histogram[int(firstPeak): int(secondPeak)]
minLoc = np.where(temp == np.min(temp))
thresh = firstPeak + minLoc[0][0]
img = image.copy()
img[img >= thresh] = 255
img[img < thresh] = 0
print("firstPeak:",firstPeak,",secondPeak:",secondPeak,",thresh:",thresh)
return img def write_tiff(path,image_gray,out):
in_ds = gdal.Open(path) # 打开样本文件
xsize = in_ds.RasterXSize # 获取行列数
ysize = in_ds.RasterYSize
bands = in_ds.RasterCount
geotransform = in_ds.GetGeoTransform()
projection = in_ds.GetProjectionRef()
driver = gdal.GetDriverByName('GTiff')
outfile = out + "\\" + os.path.basename(path).split(".tif")[0] + "_mask.tif" # 对输出文件命名
out_dataset = driver.Create(outfile, xsize, ysize, 1, gdal.GDT_Float32) # 创建一个一波段的数据框架
out_band1 = out_dataset.GetRasterBand(1)
out_band1.WriteArray(image_gray) out_dataset.SetGeoTransform(geotransform) # 写入仿射变换
out_dataset.SetProjection(projection)
return outfile if __name__ == '__main__':
mask = r"F:\algorithm\算法练习\3_cut.tif"
out = r"F:\algorithm\算法练习"
img=tif_jpg(mask).astype(np.uint8)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
seg_data = threshTwoPeaks(gray_img)
write_tiff(mask, seg_data , out)

python实现遥感图像阈值分割的更多相关文章

  1. 【Keras】基于SegNet和U-Net的遥感图像语义分割

    上两个月参加了个比赛,做的是对遥感高清图像做语义分割,美其名曰"天空之眼".这两周数据挖掘课期末project我们组选的课题也是遥感图像的语义分割,所以刚好又把前段时间做的成果重新 ...

  2. ostu进行遥感图像的分割

    城市地区道路网的简单的阈值分割.采用的是单ostu(最佳阈值分割)算法,废话少说,如果不太清楚该算法,请参考文献[1]中的图像分割这一章的介绍.程序直接运行的效果如下.

  3. python数字图像处理(11):图像自动阈值分割

    图像阈值分割是一种广泛应用的分割技术,利用图像中要提取的目标区域与其背景在灰度特性上的差异,把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合,选取一个比较合理的阈值,以确定图像中每个像素 ...

  4. 使用Keras基于RCNN类模型的卫星/遥感地图图像语义分割

    遥感数据集 1. UC Merced Land-Use Data Set 图像像素大小为256*256,总包含21类场景图像,每一类有100张,共2100张. http://weegee.vision ...

  5. 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  6. 【转】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  7. 【图像算法】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    图像算法:图像阈值分割 SkySeraph Dec 21st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified Da ...

  8. 第十四节,OpenCV学习(三)图像的阈值分割

    图像的阈值处理 图像的阈值分割:图像的二值化(Binarization) 阈值分割法的特点是:适用于目标与背景灰度有较强对比的情况,重要的是背景或物体的灰度比较单一,而且总可以得到封闭且连通区域的边界 ...

  9. opencv学习笔记3——图像缩放,翻转和阈值分割

    #图像的缩放操作 #cv.resize(src,dsize,dst=None,,fx=None,fy=None,interpolation=None) #src->原图像,dsize->目 ...

随机推荐

  1. Go语言基础知识总结(持续中)

    Go基础知识总结 变量声明 Go语言中的变量需要声明以后才可以使用(需要提前定义变量)并且声明后必须使用(不适用会报错) 标准声明 var 变量名 变量类型 example: var name str ...

  2. K-Fold 交叉验证

    转载--原文地址 www.likecs.com 1.K-Fold 交叉验证概念 在机器学习建模过程中,通行的做法通常是将数据分为训练集和测试集.测试集是与训练独立的数据,完全不参与训练,用于最终模型的 ...

  3. Arp欺骗和DNS投毒

    中间人攻击 ARP缓存攻击 ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的网络层,负责将某个IP地址解析成对应的MAC地址.简单来说,就 ...

  4. Vulnhub----bulldog靶场笔记

    前提条件 kali和bulldog靶机的的ip地址在同一个网段 本测试环境: kali:192.168.56.102 bulldog:192.168.56.101 主机探测 利用kali的netdis ...

  5. javaScript学习关于常用注册监听和对象的创建

    JS 中的自定义对象(扩展内容)                     Object 形式的自定义对象                       对象的定义:                    ...

  6. vue cli中的env详解

    前言 相信使用过 vueCli 开发项目的小伙伴有点郁闷,正常开发时会有三个接口环境(开发,测试,正式),但是 vueCli 只提供了两种 development,production(不包含 tes ...

  7. 【vue3】封装自定义全局插件

    [vue3]封装自定义全局插件 原vue2方法 main.js import Vue from 'vue' import App from './App.vue' import router from ...

  8. Apache/Nginx/IIS 访问日志详解

    Apache日志详解 1.Apache日志文件名称及所在路径 日志文件一般都是保存在在apache/logs目录下,实际情况可以根据Apache的配置文件去查找日志文件所在的路径. 例如phpstud ...

  9. 10BASE—T的主要技术特性

    1)数据传输速率10Mbps基带传输 2)每段双绞线最大长度100m 3)一条通路允许连接HUB数4个,最多5段传输介质 4)拓扑结构星型 5)访问控制方式CSMA/CD 6)帧长度可变,最大1518 ...

  10. SQL 练习18

    按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 SELECT t.cid,t.sid,t.score ,COUNT(t1.score)+1 as 排名 from sc as t LE ...