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、小结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

屈子祠镇黑鱼岭,不可移动文物预防性保护系统守遗珍

一、何止秦俑 秦陵苑囿青铜水禽等文物集中展出 文物保护&#xff0c;尤其是不可移动文物的保护&#xff0c;一直都是文化遗产的重要环节。湖南省汨罗市屈子祠镇双楚村黑鱼岭墓地&#xff0c;作为长江中游地区的重大考古发现&#xff0c;其商朝晚期的历史背景赋予其不可估量的历…

c# 语音播报

在C#中进行语音播报通常需要使用.NET Framework中的某个语音库或服务。一个常见的选择是使用System.Speech.Synthesis命名空间中的SpeechSynthesizer类&#xff0c;该类提供了文本到语音的转换功能。 以下是一个简单的示例&#xff0c;演示如何在C#中使用SpeechSynthesizer进行…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-6 绘制几何图形

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>绘制几何图形</title> </head><body><canvas id"canvas" width"250" height"150" style"border: 1px b…

QUIC with CUBIC or BBR

拥塞控制 拥塞控制算法是 TCP/QUIC 协议的一个基础部分&#xff0c;多年来经过一个个版本的迭代&#xff08;如 Tahoe、Reno、Vegas 等&#xff09;&#xff0c;拥塞控制算法得到了持续的提升。由于篇幅有限&#xff0c;本文就目前比较流行的两种拥塞控制算法&#xff08;CUBI…

SVM支持向量机

1.基本概念 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种有监督学习方法&#xff0c;主要用于分类和回归分析。它的基本思想是在特征空间中找到一个超平面&#xff0c;能够将不同类别的样本分开&#xff0c;并且使得离这个超平面最近的样本…

Linux 链接 GitHub 出现 Connection timed out

问题 安装GIT并完成公钥验证&#xff1a;Linux 系统拉取 Github项目 [rootxxx devtools]# ssh -T gitgithub.com ssh: connect to host github.com port 22: Connection timed out解决方案 进入在存放公钥私钥id_rsa.pub文件里&#xff0c;新建/修改config文本 [rootxxx my…

Java 异常处理下篇:11 个异常处理最佳实践

文章目录 前言最佳实践早抛出&#xff0c;晚捕获原则只捕获实际可处理的异常不要忽略捕捉的异常抛出具体的检查性异常正确包装自定义异常中的异常记录或抛出异常&#xff0c;但不要同时执行finally 中永远不要抛出异常或返回值避免使用异常进行流程控制使用模板方法处理重复的 …

算法训练day24回溯算法理论基础77组合

今日学习链接 https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80 https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html#%E5%89%AA%E6%9E%9D%E4%BC%98%E5%8C%96 回溯算…

sql注入,布尔盲注和时间盲注,无回显

布尔盲注 通过order by分组可以看到&#xff0c;如果正确会i显示you are in&#xff0c;错误则无任何提示&#xff0c;由此可以判断出&#xff0c;目前只显示对错&#xff0c;此外前端不会显示任何数据 也就是说&#xff0c;目前结果只有两种&#xff0c;在这种只有两种变量的…

Uniapp登录页面获取头像、昵称的最新方法的简单使用

前言 写小程序写到登录页面的时候&#xff0c;发现官方文档中原来的wx.getUserInfo和wx.getUserProfile不太能用了&#xff0c;学习了相对比较新的方法&#xff0c;这种方法的文档链接如下&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-abil…

交易策略的开发:关于市场到底能不能预测的哲学思考

文章目录 为什么要判断市场能否被预测三个方面来论述这个问题耗散结构理论什么是耗散结构 为什么要判断市场能否被预测 这个问题已经争论几十年了&#xff0c;不仅在股票市场&#xff0c;期货市场&#xff0c;外汇市场, 甚至整个金融市场。至今没有人给出一个科学的论断。 如果…

上位机是什么?与下位机是什么关系

在工业自动化领域中&#xff0c;上位机是一项关键而引人注目的技术。许多人对上位机的概念感到好奇&#xff0c;想要深入了解其在工业智能中的作用。那么&#xff0c;上位机究竟是什么呢&#xff1f; 首先&#xff0c;上位机是一种用于工业控制系统的软件应用&#xff0c;通常…

配置支持 OpenAPI 的 ASP.NET Core 应用

写在前面 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 本文记录如何配置基于Swagger 的 ASP.NET Core 应用程序的 OpenAPI 规范。 需要从NuGet 安装 Swashbuckle.AspNetCore 包 代码实现 var builder WebApplicati…

STM32G4单片机

单片机的基本结构 CPU就是中央处理器&#xff0c;是单片机的内核 时钟电路&#xff0c;时钟源是给整个电路提供时序 其他的外设、中断以及存储器都是通过系统总线与CPU进行连接 RAM相当于电脑的内存条&#xff0c;随机存储器&#xff0c;掉电会丢失 ROM相当于电脑的硬盘&am…

vmstat 监控虚拟内存,进程,CPU

文章目录 1. 命令格式&#xff1a;2. 命令功能&#xff1a;3. 命令参数&#xff1a;4. 使用实例&#xff1a;实例1&#xff1a;显示虚拟内存使用情况实例2&#xff1a;显示活跃和非活跃内存实例3&#xff1a;查看系统已经fork了多少次实例4&#xff1a;查看内存使用的详细信息实…

美籍华裔力学和数学家林家翘

林家翘&#xff08;1916年7月7日—2013年1月13日&#xff09;&#xff0c;出生于北京&#xff0c;男&#xff0c;原籍福建福州&#xff0c;力学和数学家&#xff0c;美国艺术与科学院院士、美国国家科学院院士、中国科学院外籍院士&#xff0c;麻省理工学院荣誉退休教授 [1]。 …

初始MySQL

一 SQL的基本概述 基本概述 ▶SQL全称: Structured Query Language&#xff0c;是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统SystemR上实现。 ▶美国国家标…

【Linux】Linux基本指令

目录 1.ls指令 2.cd指令 3.touch指令 4.mkdir指令 5.rmdir指令和rm指令 5.1rmdir指令 5.2rm指令 6.man指令 7.cp指令 8.mv指令 9.cat指令 10.more指令 && less指令 10.1more指令 10.2less指令 11.head指令 && tail指令 11.1head指令 11.2tai…

第23课 使用FFmpeg将rtmp流再转推到rtmp服务器

通过上节课的学习&#xff0c;我们已经可以正常播放本地rtmp流及mp4文件&#xff0c;这节课&#xff0c;我们将在上节课的基础上实现一个常用的转推功能&#xff1a;读取rtmp流或mp4文件并转推到rtmp服务器上实现直播转发功能。 一、FFmpeg API 转码推流的一般过程 1.引入ffm…

内存泄漏调试 ---- jemalloc的heap profiling

使用jemalloc时&#xff0c;可以通过profiling机制来发现并定位内存泄漏(memory leak)。本文翻译自原文并增加了一些例子。 1、安装 这里我们编译安装jemalloc.5.10&#xff0c;注意在configure的时候添加了–enable-prof选项&#xff0c;这样才能打开profiling机制。下文中通…