Python处理图片生成天际线(2024.1.29)

2024-01-30 21:12

本文主要是介绍Python处理图片生成天际线(2024.1.29),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、天际线简介

        天际线SkyLine)顾名思义就是天空与地面的边界线,人站在不同的高度,会看到不同的景色和地平线,天空与地面建筑物分离的标记线,不得不说,每天抬头仰望天空,相信大家都可以看到,它的的确确客观存在,美丽值得欣赏。

2、Python代码

#-*- coding:utf-8 -*-
import sys
from os.path import exists
import cv2
import numpy as npdef getImage(height, width, channels):image = np.zeros([height, width, 3], np.uint8) # 三通道顺序是BGR# 三层循环逐个修改像素点for row in range(height):for col in range(width):for c in range(channels):image[row, col, c] = 0return imagedef isWhite(pixel_value, threshold): #阈值可以取10、20、30、50、100res = Falseif pixel_value[0] > threshold and pixel_value[1] > threshold and pixel_value[2] > threshold: # 10、10、10 50、50、50 这里是天空和地面楼山的分界线,需要调参res = Truereturn resdef isPureWhite(pixel_value):res = Falseif pixel_value[0] == 255 and pixel_value[1] == 255 and pixel_value[2] == 255: # >3|>3|>3 10、10、10res = Truereturn resdef getRowNumberSpecificCol(image, col):res_row = -1height, width = image.shape[0:2]if col >= 0 and col < width:for row in range(0, height):pv = image[row][col]if(pv[0] > 0 and pv[1] > 0 and pv[2] >0):res_row = rowbreakreturn res_rowdef getEnhancedEdgeImageFromEdgeImage(edge_Image):edge_SrcImage = edge_Imageheight, width = edge_SrcImage.shape[0:2]for col in range(1, width):for row in range(0, height):pixel_value = edge_SrcImage[row][col]  # 计算红绿蓝三波段的平均值if isPureWhite(pixel_value):r_last = getRowNumberSpecificCol(edge_SrcImage, col - 1)if r_last:if row > r_last:minR, maxR = r_last, rowfor k in range(minR, maxR):edge_SrcImage[k][col - 1][0] = 255edge_SrcImage[k][col - 1][1] = 255edge_SrcImage[k][col - 1][2] = 255else:minR, maxR = row, r_lastfor k in range(minR, maxR):edge_SrcImage[k][col][0] = 255edge_SrcImage[k][col][1] = 255edge_SrcImage[k][col][2] = 255# cv2.imshow("Enhanced-edge-image", edge_SrcImage)return edge_SrcImagedef getFileExtensionname(filename):res = ".png"dot_index = -1for i in range(len(filename), 0):if filename[i] == '.':dot_index = ibreakif dot_index != -1:res = filename[dot_index: len(filename)-1]return resif __name__ == '__main__':origin_pic_filename = "D:/test.png"sky_ground_threshold = 30isDownSampling = Falseif (len(sys.argv) == 1):print(sys.argv[0])origin_pic_filename = ""elif(len(sys.argv) == 2):origin_pic_filename = str(sys.argv[1])elif(len(sys.argv) == 3):origin_pic_filename = str(sys.argv[1])sky_ground_threshold = int(sys.argv[2])elif (len(sys.argv) == 4):origin_pic_filename = str(sys.argv[1])sky_ground_threshold = int(sys.argv[2])if(int(sys.argv[3]) == 1):isDownSampling = Trueif origin_pic_filename != "" and sky_ground_threshold > 0:print(("输入图片文件名为:{0}").format(origin_pic_filename))print(("天空地面分界灰度阈值为:{0}").format(sky_ground_threshold))suffix_name = getFileExtensionname(origin_pic_filename)print(("后缀名为:{0}").format(suffix_name))srcImage = cv2.imread(origin_pic_filename)inputSrcImage = srcImageif isDownSampling:inputSrcImage = cv2.pyrDown(inputSrcImage)height, width = inputSrcImage.shape[0:2]print(("高度:{0}, 宽度:{1}").format(height, width))cv2.namedWindow('downsampling-image', cv2.WINDOW_AUTOSIZE)cv2.imshow("downsampling-image", inputSrcImage)Sobelx = cv2.Sobel(inputSrcImage, cv2.CV_64F, 1, 0)Sobely = cv2.Sobel(inputSrcImage, cv2.CV_64F, 0, 1)Sobelx = cv2.convertScaleAbs(Sobelx)Sobely = cv2.convertScaleAbs(Sobely)# cv2.imshow("sobel-x-Abs", Sobelx)# cv2.imshow("sobel-y-Abs", Sobely)Sobelxy = cv2.addWeighted(Sobelx, 0.5, Sobely, 0.5, 0)cv2.namedWindow('sobel-xy', cv2.WINDOW_AUTOSIZE)cv2.imshow('sobel-xy', Sobelxy)edgeImage = getImage(height, width, 3)for col in range(0, width):for row in range(0, height):pixel_value = Sobelxy[row][col]  # 计算红绿蓝三波段的平均值if isWhite(pixel_value, sky_ground_threshold):edgeImage[row][col][0] = 255edgeImage[row][col][1] = 255edgeImage[row][col][2] = 255breakcv2.namedWindow('edge-image', cv2.WINDOW_AUTOSIZE)cv2.imshow('edge-image', edgeImage)cv2.imwrite(origin_pic_filename.replace(suffix_name, "-ZGetEdge.png"), edgeImage)enhanced_edgeImage = getEnhancedEdgeImageFromEdgeImage(edgeImage)cv2.namedWindow('enhanced-edge-image', cv2.WINDOW_AUTOSIZE)cv2.imshow('enhanced-edge-image', enhanced_edgeImage)cv2.imwrite(origin_pic_filename.replace(suffix_name, "-EnhancedEdge.png"), enhanced_edgeImage)for col in range(0, width):for row in range(0, height):pixel_value = enhanced_edgeImage[row][col]  # 计算红绿蓝三波段的平均值if isPureWhite(pixel_value):if row+2 < height:inputSrcImage[row+2][col][0] = 0inputSrcImage[row+2][col][1] = 0inputSrcImage[row+2][col][2] = 255else:inputSrcImage[row][col][0] = 0inputSrcImage[row][col][1] = 0inputSrcImage[row][col][2] = 255# inputSrcImage[row][col][0] = 0# inputSrcImage[row][col][1] = 0# inputSrcImage[row][col][2] = 255# break #最开始从每列遍历从上到下找第一个分界点就停止才用breakcv2.namedWindow('RedEdge-image', cv2.WINDOW_AUTOSIZE)cv2.imshow('RedEdge-image', inputSrcImage)cv2.imwrite(origin_pic_filename.replace(suffix_name, "-RedEdge.png"), inputSrcImage)cv2.waitKey(0)cv2.destroyAllWindows()print('Success!')cv2.waitKey()cv2.destroyAllWindows()

3、运行结果

        test.jpg下载

3.1 非下采样+边缘检测

python GetSkyLine.py test.jpg  100
原始图片
边缘点图片
边缘增强图片
sobel-xy处理后图片
downloadsampling图片
红色边缘叠加图片

3.2 下采样+边缘检测

python GetSkyLine.py test.jpg  50  1
原始图片
边缘点图片
边缘增强图片
downloadsampling图片
sobel-xy处理后图片
红色边缘叠加图片

4、小结

        在这个人世间,每个人都是独立的个体,身处浩荡洪流之中,难免身不由己,时而坚定,时而困惑,但我们还是应该永远相信美好的事情终将发生,要心怀一颗感恩的心,相信家人,相信自己,相信未来,坦然面对生活,接受平凡。

       关关难过关关过,前路漫漫亦灿灿

这篇关于Python处理图片生成天际线(2024.1.29)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/661572

相关文章

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand