kaggle竞赛 | 计算机视觉 | 数字图像基础操作

news2025/4/4 17:09:19

目录

  • cv2基本操作
  • 图片哈希
  • 图像数据扩展
    • 无监督数据扩展方法
    • 监督式数据扩展方法

cv2基本操作

import numpy as np
import matplotlib.pyplot as plt
import cv2

img = cv2.imread('cat.jpeg')
plt.imshow(img)

在这里插入图片描述

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

BGR2RGB,将BGR转化为RGB
在这里插入图片描述
转化为灰度图

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(img,cmap='gray')

在这里插入图片描述

转化为HSV图像

H代表色色调,用角度度量,取值范围为0°-360°。从红色开始安逆时针方向计算,红色为0度,绿色为120度,蓝色为240度。
S代表饱和度,饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例越大,颜色越接近光谱色,颜色的饱和度也就越高。饱和度高,颜色就越深越艳。
V代表明度。明度表示颜色明亮的程度,对于光源色,明度值与发光体的亮度有关;对于物体色,明度值和物体的透射比和反色比有关。通常取值范围为0%(黑)到100%(白)。

RGB

RGB 是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色®,绿色(G)和蓝色(B)。这三种颜色的不同组合可以形成几乎所有的其他颜色。
RGB 颜色空间是图像处理中最基本、最常用、面向硬件的颜色空间,比较容易理解。
RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
plt.imshow(img,cmap='gray')

在这里插入图片描述
添加滤波器,类似于卷积
不同的kernel,得到的图片效果不同
此时的kernel_sharpening会使图片更具有细节

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(20, 20))
plt.subplot(1, 2, 1)
plt.imshow(img)

kernel_sharpening = np.array([[-1,-1,-1], 
                              [-1,9,-1], 
                              [-1,-1,-1]])
sharpened = cv2.filter2D(img, -1, kernel_sharpening)

plt.subplot(1, 2, 2)
plt.title("Image Sharpening")
plt.imshow(sharpened)

在这里插入图片描述

erode操作,忽视部分细节

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(20, 20))
plt.subplot(1, 2, 1)
plt.title("Original")
plt.imshow(img)


# Let's define our kernel size
kernel = np.ones((5,5), np.uint8)

# Now we erode
erosion = cv2.erode(img, kernel, iterations = 1)

plt.subplot(1, 2, 2)
plt.title("Erosion")
plt.imshow(erosion)

在这里插入图片描述
提取图片线条,边缘检测

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
height, width,_ = img.shape

# X角度线条
sobel_x = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
# Y角度线条
sobel_y = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)

plt.figure(figsize=(20, 20))

# 原始线条
plt.subplot(3, 2, 1)
plt.title("Original")
plt.imshow(img)

plt.subplot(3, 2, 2)
plt.title("Sobel X")
plt.imshow(sobel_x)

plt.subplot(3, 2, 3)
plt.title("Sobel Y")
plt.imshow(sobel_y)


sobel_OR = cv2.bitwise_or(sobel_x, sobel_y)

plt.subplot(3, 2, 4)
plt.title("sobel_OR")
plt.imshow(sobel_OR)

# 拉普拉斯算子  边缘检测
laplacian = cv2.Laplacian(img, cv2.CV_64F)

plt.subplot(3, 2, 5)
plt.title("Laplacian")
plt.imshow(laplacian)

 # Canny()边缘检测
canny = cv2.Canny(img, 50, 120)

plt.subplot(3, 2, 6)
plt.title("Canny")

调整图片尺寸和大小

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(20, 20))

plt.subplot(2, 2, 1)
plt.title("Original")
plt.imshow(img)

# 3/4图片大小
image_scaled = cv2.resize(img, None, fx=0.75, fy=0.75)

plt.subplot(2, 2, 2)
plt.title("Scaling - Linear Interpolation")
plt.imshow(image_scaled)

# 2倍图片大小
img_scaled = cv2.resize(img, None, fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

plt.subplot(2, 2, 3)
plt.title("Scaling - Cubic Interpolation")
plt.imshow(img_scaled)

# 调整图片宽高
img_scaled = cv2.resize(img, (900, 400), interpolation = cv2.INTER_AREA)

plt.subplot(2, 2, 4)
plt.title("Scaling - Skewed Size")
plt.imshow(img_scaled)

选取图片的部分区域

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(20, 20))

plt.subplot(2, 2, 1)
plt.title("Original")
plt.imshow(img)

height, width = img.shape[:2]

# 让我们获取起始像素坐标(裁剪矩形的左上角)
start_row, start_col = int(height * .25), int(width * .25)

# 让我们获取起始像素坐标(裁剪矩形的右下角)
end_row, end_col = int(height * .75), int(width * .75)

# 只需使用索引即可裁剪出所需的矩形
cropped = img[start_row:end_row , start_col:end_col]


plt.subplot(2, 2, 2)
plt.title("Cropped")
plt.imshow(cropped)

在这里插入图片描述
滤波器的kernel全1,是一种模糊操作

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(20, 20))

plt.subplot(2, 2, 1)
plt.title("Original")
plt.imshow(img)

# Creating our 3 x 3 kernel
kernel_3x3 = np.ones((3, 3), np.float32) / 9

# We use the cv2.fitler2D to conovlve the kernal with an image 
blurred = cv2.filter2D(img, -1, kernel_3x3)

plt.subplot(2, 2, 2)
plt.title("3x3 Kernel Blurring")
plt.imshow(blurred)

# Creating our 7 x 7 kernel
kernel_7x7 = np.ones((7, 7), np.float32) / 49

blurred2 = cv2.filter2D(img, -1, kernel_7x7)

plt.subplot(2, 2, 3)
plt.title("7x7 Kernel Blurring")
plt.imshow(blurred2)

在这里插入图片描述
卷积核越大,越模糊

图片哈希

import imagehash
from PIL import Image

ahash = imagehash.average_hash(Image.open("cat.jpeg"))
ahash

在这里插入图片描述

str(ahash)

在这里插入图片描述

图像数据扩展

无监督数据扩展方法

albumentations库 简单实用

from albumentations import (
    HorizontalFlip, IAAPerspective, ShiftScaleRotate, CLAHE, RandomRotate90,
    Transpose, ShiftScaleRotate, Blur, OpticalDistortion, GridDistortion, HueSaturationValue,
    IAAAdditiveGaussianNoise, GaussNoise, MotionBlur, MedianBlur, IAAPiecewiseAffine,
    IAASharpen, IAAEmboss, RandomContrast, RandomBrightness, Flip, OneOf, Compose, RandomGamma, 
    ElasticTransform, ChannelShuffle,RGBShift, Rotate
)

# 图像水平翻转
img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 水平翻转的概率
aug = HorizontalFlip(p=1)
img_aug = aug(image = img)['image']

plt.figure(figsize=(20, 20))
plt.subplot(1, 2, 1)
plt.imshow(img)

plt.subplot(1, 2, 2)
plt.imshow(img_aug)

在这里插入图片描述
部分复杂形态变化

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

aug = GridDistortion(p=1)
img_aug = aug(image = img)['image']

plt.figure(figsize=(20, 20))
plt.subplot(1, 2, 1)
plt.imshow(img)

plt.subplot(1, 2, 2)
plt.imshow(img_aug)

在这里插入图片描述
角度变化

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

aug = ShiftScaleRotate(p=1)
img_aug = aug(image = img)['image']

plt.figure(figsize=(20, 20))
plt.subplot(1, 2, 1)
plt.imshow(img)

plt.subplot(1, 2, 2)
plt.imshow(img_aug)

在这里插入图片描述

多个数据扩增方法一起运用 Compose方法

img = cv2.imread('cat.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

aug = Compose([
    ShiftScaleRotate(p=1),
    HorizontalFlip(p=1),
    RandomBrightness(p=1)
])
img_aug = aug(image = img)['image']

plt.figure(figsize=(20, 20))
plt.subplot(1, 2, 1)
plt.imshow(img)

plt.subplot(1, 2, 2)
plt.imshow(img_aug)

在这里插入图片描述

监督式数据扩展方法

在这里插入图片描述

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

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

相关文章

JUC并发编程(2.Java线程)

1.线程运行原理 栈与栈帧 Java Virtual Machine Stacks (Java 虚拟机栈) 我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?栈内存是给线程用,每个线程启动后,虚拟机就会为其分配一块栈内…

cmake 05 使用库

本文目标 使用自己写的动态库使用第三方库更新 cm 使用自己的动态库 写一个简单的库 目录结构 F:\2023\code\cmake\calc>tree /f 卷 dox 的文件夹 PATH 列表 卷序列号为 34D2-6BE8 F:. │ CMakeLists.txt │ ├─include │ └─calc │ calc.h │ └─srcc…

2022除夕卖水果

急促的呼吸,急促的爱,急促的吆喝声 来吧 朋友 伸出你的手 还有十分钟,拆拆盒子收摊中 管尝管饱,礼盒散装可打包 红橙黄绿青蓝紫 苹果樱桃小番茄 柠檬枳柑桔橙柚 香蕉龙眼与柠檬 蜜瓜西瓜猕猴桃 提子樱桃火龙果 葡萄甘蔗车厘子 柿子…

ES常用知识点整理第一部分

ES常用知识点整理第一部分引言APICrud APIBulk API批量读取批量查询ES服务器常见错误返回倒排索引分词器中文分词器Search APIURI SearchQuery DSL查询表达式短语搜索Query String 和 Simple Query Stringmapping映射动态映射手动映射多字段特性自定义分词Index TemplateDynami…

【Ubuntu】Nacos 2.1 单机安装

目录Nacos 2.1 单机安装1. 从GitHub下载2.1.0的压缩包2. 解压与配置3. 数据库配置4. 单机启动nacos遇到的一些错误ErrMsg:jmenv.tbsite.netlibstdc.so.6: cannot open shared object file: No such file or directoryCaused by: java.lang.IllegalStateException: No DataSourc…

3DCAD图纸转2D(DXF)图纸通用解决方案文稿

3DCAD图纸转2D(DXF)图纸通用解决方案文稿 本文地址:https://gitee.com/dvaloveu/lovedva/issues/I6B5YC 视频演示(1.25倍速&原速):Acfun Bilibili 脚本地址:https://gitee.com/dvaloveu/ug-automation/blob/master/ug2caxa/hellowolrd.p…

第二章物理层-第五节:信道的极限容量

文章目录一:相关概念(1)失真(2)信道带宽W(3)波特率(Baud)二:奈奎斯特定理(奈氏准则)三:香农定理本节对应视频 【计算机网络…

sql注入绕过(持续更新)

判断存在注入 ab|| 查询表名 select{x table_name}from information_schema.tables where table_schemadatabase# () SQL 中的 substring 函数是用来抓出一个栏位资料中的其中一部分。这个函数的名称在不同的资料库中不完全一样: MySQL: SUBSTR( ), SUBSTRING(…

Coolify系列01- 从0到1超详细手把手教你上手Heroku 和 Netlify 的开源替代方案

什么是Coolify 一款超强大的开源自托管 Heroku / Netlify 替代方案coolLabs是开源、自托管和以隐私为中心的应用程序和服务的统称 为什么使用Coolify 只需单击几下即可托管你的应用、数据库或其他开源服务,等。它是 Heroku 和 Netlify 的一个替代方案。通过 Cool…

springbootWeb常用注解使用

springbootWeb常用注解使用PathVariable 路径变量注解RequestHeader 请求标头注解RequestParam 请求域注解RequestBody 请求体注解ModelAttribute使用1,将其置于方法上:使用2,将其置于方法参数上:CookieValuePathVariable 路径变量注解 可以…

3.4动态规划--最大字段和

要好好学习这个难受难受超级难受的动态规划了,千万不要再沉迷在看剧和玩耍里面了。必须承认最近没有好好学习。 写在前面 最大字段和书上介绍了三种解法:暴力、递归分治、动态规划 递归分治,一分为二,合并的时候有三种情况&…

java容器轻松理解 collection collections(异同篇)

(1)collectionset (只能迭代,不可以按下标取值)hashset、Treesetlist(可以迭代,也可以按下标取值)ArrayList、LinkedList、Vector特点:ArrayList:方便随机访问,由数组实现的。所以中…

十大经典排序算法(动态演示+代码)-选择排序与插入排序

选择排序 一、什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的中数据元素选出最小(或最大)的一个元素,存放在序列的起始位置&#xff0c…

行为型模式-策略模式

1.概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发&a…

04_iic子系统

总结 iic_client和iic_driver 加入iic总线的思想和paltform总线的玩法一样 把iic设备和驱动注册到iic总线中 构造出字符设备驱动和设备节点供app进行操作 但是iic硬件设备是挂在iic控制器下面的 所以iic控制器也会有自己的驱动和设备树节点 厂家一般都会帮做好 我们写的iic_dr…

离散系统的数字PID控制仿真-2

设计离散PID控制器,各信号的跟踪结果如图所示,其中S代表输入指令信号的类型。通过取余指令 mod实现三角波和锯齿波。当S1时为三角波,S2时为锯齿波,S3时为随机信号。在仿真过程中,如果 D1,则通过 pause命令实…

Prometheus学习整理-Prometheus-operator

Prometheus中的promQL语句: Prometheus提供的一种promQL语法,用来处理接口数据,然后方便用户对数据进行处理加工,它是Prometheus专门提供的一个函数表达式语言,可以实时的查询和聚合时间序列的数据,通过HTTPApi的方式提供给外部使用,PromQL主要分为下面的几种类型数据: 这里面的…

【老卫搞机】136期:华为开发者联盟社区2022年度战码先锋2期开源贡献之星

首先祝大家兔年大吉,身体安康,钱兔似锦!接上次的“2022年牛人之星”( https://developer.huawei.com/consumer/cn/forum/topic/0203109930647268095),今天咱们来开箱另外一件特殊的奖品,来自华为…

MySQL内外连接

文章目录MySQL内外连接内连接外连接左外连接右外连接简单案例MySQL内外连接 表的连接分为内连接和外连接。 内连接 内连接 内连接的SQL如下: SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;说明一下: …

零基础学JavaWeb开发(二十三)之 springmvc入门到精通(3)

5、springspringmvcmybatis整合 5.1、项目技术需求分析 1.使用ssmlayui技术开发 对用户表数据实现增删改查 采用前后端分离架构模式 5.2、SSM环境的整合之提供增删改查 整合数据库表结构 CREATE TABLE mayikt_users (id int NOT NULL AUTO_INCREMENT,name varchar(255) CH…