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.rhkb.cn/news/249433.html

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

相关文章

python实现贪吃蛇小游戏(附源码)

文章目录 导入所需的模块坐标主游戏循环模块得分 贪吃蛇小游戏&#xff0c;那个曾经陪伴着00后和90后度过无数欢笑时光的熟悉身影&#xff0c;仿佛是一把打开时光之门的钥匙。它不仅是游戏世界的经典之一&#xff0c;更是我们童年岁月中不可或缺的一部分&#xff0c;一个承载回…

CIFAR-10数据集详析:使用卷积神经网络训练图像分类模型

1.数据集介绍 CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成&#xff0c;每类 6000 张图像。有 50000 张训练图像和 10000 张测试图像。 数据集分为5个训练批次和1个测试批次&#xff0c;每个批次有10000张图像。测试批次正好包含从每个类中随机选择的 1000 张图像…

Android平台如何实现RTSP转GB28181

为什么要做GB28181设备接入侧&#xff1f; 实际上&#xff0c;在做Android平台GB28181设备接入模块的时候&#xff0c;我们已经有了非常好的技术积累&#xff0c;比如RTMP推送、轻量级RTSP服务、一对一互动模块、业内几乎最好的RTMP|RTSP低延迟播放器。 Android平台GB28181接…

VBA技术资料MF113:将文件夹图像添加到PowerPoint

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

第七讲_JavaScript的Iterator和Generator

JavaScript的Iterator和Generator 1. Iterator1.2 for-of语法糖 2. Generator2.1 定义一个生成器函数2.2 常用的方法2.3 基本用法2.4 传参的用法2.5 异步的用法 1. Iterator ES6 中&#xff0c;默认的 Iterator 接口部署在数据结构的 Symbol.iterator 属性。一个数据结构只要拥…

vue前端html导出pdf

package.json中添加依赖 调用方&#xff1a; import htmlToPdf from ../../../utils/file/htmlToPdf.js// 下载方法&#xff0c;pdfDownloadDpi为onClickDownLoad() {htmlToPdf.getPdf(标题1, jsfgyzcpgxmShow, this.pdfDownloadDpi)}htmlToPdf.js // 页面导出为pdf格式 imp…

微分几何——梅向明第四版学习笔记(二) 曲面论、外微分形式和活动标架

目录 引出曲面论曲面的概念曲面的切平面和法线曲面的第一基本形式曲面域的面积 曲面的第二基本形式曲面上曲线的曲率曲面的渐进方向曲面的共轭方向曲面的主方向和曲率线 曲面的三个曲率主曲率高斯曲率&#xff0c;平均曲率案例 曲面在一点邻近的结构曲面的第三基本形式高斯曲率…

zookeeper(2) 服务器动态上下线监听和分布式锁案例

案例一&#xff1a;服务器动态上下线监听 某分布式系统中&#xff0c;主节点可以有多台&#xff0c;可以动态上下线&#xff0c;任意一台客户端都能实时感知 到主节点服务器的上下线。 1.服务端代码 package com.atguigu.case1;import org.apache.zookeeper.*;import java.io…

静态时序分析:时序弧以及其时序敏感(单调性)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中&#xff0c;不管是组合逻辑单元&#xff08;如与门、或门、与非门等&#xff09;还是时序逻辑&#xff08;D触发器等&#xff09;在时序建模时…

springCloud gateway 防止XSS漏洞

springCloud gateway 防止XSS漏洞 一.XSS(跨站脚本)漏洞详解1.XSS的原理和分类2.XSS漏洞的危害3.XSS的防御 二.Java开发中防范XSS跨站脚本攻击的思路三.相关代码&#xff08;适用于spring cloud gateway&#xff09;1.CacheBodyGlobalFilter.java2.XssRequestGlobalFilter.java…

强大的虚拟机Parallels Desktop 19 mac中文激活

Parallels Desktop是一款功能全面、易于使用的虚拟机软件&#xff0c;它为用户提供了在Mac电脑上同时运行多个操作系统的便利。 软件下载&#xff1a;Parallels Desktop 19 mac中文激活版下载 Parallels Desktop 19 mac具有快速启动和关闭虚拟机的能力&#xff0c;让用户能够迅…

STM32G4 系列命名规则

STM32G4产品线 基础型系列STM32G4x1 具有入门级模拟外设配置&#xff0c;单存储区Flash&#xff0c;支持的Flash存储器容量范围从32到512KB。 增强型系列STM32G4x3 与基本型器件相比具有更多数量的模拟外设&#xff0c;以及双存储区Flash&#xff0c;Flash存储器容量也提高…

C#学习笔记_类(Class)

类的定义 类的定义是以关键字 class 开始&#xff0c;后跟类的名称。类的主体&#xff0c;包含在一对花括号内。 语法格式如下&#xff1a; 访问标识符 class 类名 {//变量定义访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;......//方…

【Day37】代码随想录之贪心_738.单调递增的数字_968.监控二叉树

文章目录 738.单调递增的数字968.监控二叉树 738.单调递增的数字 参考文档&#xff1a;代码随想录 题目&#xff1a; 给定一个非负整数 N&#xff0c;找出小于或等于 N 的最大的整数&#xff0c;同时这个整数需要满足其各个位数上的数字是单调递增。 &#xff08;当且仅当每个相…

你的MiniFilter安全吗?

简介 筛选器管理器 (FltMgr.sys)是Windows系统提供的内核模式驱动程序, 用于实现和公开文件系统筛选器驱动程序中通常所需的功能; 第三方文件系统筛选器开发人员可以使用FltMgr的功能可以更加简单的编写文件过滤驱动, 这种驱动我们通常称为MiniFilter, 下面是MiniFilter的基本…

基于SpringBoot+Vue学科竞赛管理系统

文章目录 基于SpringBootVue学科竞赛管理系统1系统概述1.3系统设计思想 2相关技术2.1 MYSQL数据库2.2 B/S结构2.3 Spring Boot框架简介2.4 Vue简介 3系统分析3.1可行性分析3.1.1技术可行性3.1.2经济可行性3.1.3操作可行性 3.2系统性能分析3.2.1 系统安全性3.2.2 数据完整性 3.4…

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药

2024年初&#xff0c;学习状态回顾 开稿时间&#xff1a;2024-1-23 归家百里去&#xff0c;飘雪送客迟。 搁笔日又久&#xff0c;一顾迷惘时。 我们饱含着过去的习惯&#xff0c;缺乏自我意识是毒药&#xff0c;反思和回顾是解药。 文章目录 2024年初&#xff0c;学习状态回顾一…

虚拟机(VMware)ubuntu16.04 直接连接网口设备 USRP 吊舱

编辑虚拟网络编辑器 点击之后 选择网卡之后&#xff0c;点击确定。 电脑配置 使用了&#xff1a;192.168.2.56 虚拟机内部配置 和PC的配置一致

【Matlab】音频信号分析及FIR滤波处理——凯泽(Kaiser)窗

一、前言 1.1 课题内容: 利用麦克风采集语音信号(人的声音、或乐器声乐),人为加上环境噪声(窄带)分析上述声音信号的频谱,比较两种情况下的差异根据信号的频谱分布,选取合适的滤波器指标(频率指标、衰减指标),设计对应的 FIR 滤波器实现数字滤波,将滤波前、后的声音…

Zoho Mail 2023:回顾过去,展望未来:不断进化的企业级邮箱解决方案

当我们告别又一个非凡的一年时&#xff0c;我们想回顾一下Zoho Mail如何融合传统与创新。我们迎来了成立15周年&#xff0c;这是一个由客户、合作伙伴和我们的敬业团队共同庆祝的里程碑。与我们一起回顾这段旅程&#xff0c;探索定义Zoho Mail历史篇章的敏捷性、精确性和创新性…