OpenCV-Python小应用(九):通过灰度直方图检测图像异常点

OpenCV-Python小应用(九):通过灰度直方图检测图像异常点

  • 前言
  • 前提条件
  • 相关介绍
  • 实验环境
  • 通过灰度直方图检测图像异常点
    • 代码实现
    • 输出结果
  • 参考

在这里插入图片描述
在这里插入图片描述

前言

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

前提条件

  • 熟悉Python

相关介绍

  • Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
  • OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
  • OpenCV用C++语言编写,它具有C++、Python、Java和MATLAB接口,并支持Windows、Linux、Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令。
  • 图像的灰度值是指图像中每个像素的亮度值,通常用于黑白图像。灰度值的范围通常是0到255,其中0表示黑色,255表示白色。在计算机视觉中,灰度图像是由纯黑和纯白来过渡得到的,在黑色中加入白色就得到灰色,纯黑和纯白按不同的比例来混合就得到不同的灰度值。
  • 在灰度图像中,每个像素的颜色值都是灰度值,指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0。在灰度图像中,每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。
  • 灰度直方图是一种用来描述数字图像中灰度级分布的图形工具。它是一个灰度级的函数,表示图像中具有某种灰度级的像素的个数,反映了图像中每种灰度出现的频率。
  • 灰度直方图是图像处理中非常重要的一个概念,它是我们对图像本身灰度的一个分析以及之后我们需要做二值化的一个基础的概念
  • 灰度直方图可以用来分析图像的对比度、亮度等特征,也可以用于图像增强、图像分割、图像压缩等领域。
  • 图像灰度直方图相关知识点,可查阅OpenCV-Python快速入门(九):直方图

实验环境

  • Python 3.6.13 (面向对象的高级语言)
  • OpenCV 3.4.10(python第三方库)pip3 install opencv-python==3.4.10.37

通过灰度直方图检测图像异常点

  • 基本思路:通过计算图像灰度,得到灰度直方图,这里认为灰度直方图中灰度值像素个数较少的灰度值大概率为异常点。
    在这里插入图片描述
  • 目录结构
    在这里插入图片描述

在这里插入图片描述

代码实现

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

def cal_low_high_hist(img):
    hist = cv2.calcHist([img],[0],None,[256],[0,255])
    flattened_hist = hist.flatten()  # [[255],[125],...] -> [255,125,...]
    # print(sum(flattened_hist)*0.125) # 下分位
    # print(sum(flattened_hist)*(1-0.125)) # 上分位
    # plt.plot(hist,color='b')
    # plt.show()
    
    # 下分位
    nums = 0
    for i in range(len(flattened_hist)):
        low_sum = sum(flattened_hist)*0.125
        nums += flattened_hist[i]
        if nums > low_sum:
            # print(i)
            break
            
    # 上分位
    nums = 0
    for j in range(len(flattened_hist)):
        low_sum = sum(flattened_hist)*(1-0.125)
        nums += flattened_hist[j]
        if nums > low_sum:
            # print(j)
            break
            
    return i,j

if __name__=="__main__":
    # 上分位计算值
    up_cal_val = [15,255]
    
    # 下分位计算值
    low_cal_val = [-255,-15]
    
    img_dir = 'imgs'
    img_name_list = os.listdir(img_dir)

    output_folder = 'out_imgs'
    if not os.path.exists(output_folder):
        os.mkdir(output_folder)

    for img_name in  img_name_list:
        img_path = os.path.join(img_dir,img_name)
        img = cv2.imread(img_path,0)
        i,j = cal_low_high_hist(img) # 下,上
        # print(i,j)
        up_cal_res = list(map(lambda x: x + j, up_cal_val))
        low_cal_res = list(map(lambda x: x + i, low_cal_val))
        # print(up_cal_res,low_cal_res) 
        up_cal_res = [x if x <= 255 else 255 for x in up_cal_res] # 亮点(异常点)
        low_cal_res = [x if x >= 0 else 0 for x in low_cal_res] # 暗点(异常点)
        # print(up_cal_res,low_cal_res) 
        
        #找到满足条件的像素点
        condition = np.logical_or(img>min(up_cal_res),img<max(low_cal_res))

        out_of_range_pixels = np.count_nonzero(condition)
        # print(out_of_range_pixels)
        # total_out_of_range_pixels += out_of_range_pixels
        
        small_image = copy.deepcopy(img)

        if out_of_range_pixels>4:
            contours,_ = cv2.findContours(condition.astype(np.uint8),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

            valid_rectangles=[]
            for i,c in enumerate(contours):
                box=cv2.boundingRect(c)
                x,y,w,h, =box
                center_x=x+w//2
                center_y=y+h//2
                # valid_rectangles.append((x,y,w,h,center_x,center_y))
                valid_rectangles.append([x,y,w,h,center_x,center_y])
                # cv2.drawContours(small_image,contours,i,(0,255.0),2)
                # cv2.rectangle(small_image,(x,y),(x+w,y+h),(0,0,255),2)

            pad = 5
            for i,(x,y,w,h,_,_) in enumerate(valid_rectangles):
                cv2.rectangle(small_image,(x-pad,y-pad),(x+w+pad,y+h+pad),(0,0,255),1)
                

            # 保存图片
            output_filename = f"{os.path.splitext(img_name)[0]}_res.jpg"
            output_path = os.path.join(output_folder,output_filename)
            cv2.imwrite(output_path,small_image)

            # 显示图片
            show_img = cv2.resize(small_image,(small_image.shape[1],small_image.shape[0]))
            cv2.imshow('{}'.format(output_filename),show_img)
            cv2.waitKey()
            cv2.destroyAllWindows()    

输出结果

在这里插入图片描述
在这里插入图片描述

参考

[1] https://opencv.org/
[2] 李立宗. OpenCV轻松入门:面向Python. 北京: 电子工业出版社,2019

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

笔记:AI量化策略开发流程-基于BigQuant平台(一)

从本文开始&#xff0c;按照AI策略开发的完整流程&#xff08;共七步&#xff09;&#xff0c;上手在BigQuant平台上快速构建AI策略。本文首先介绍如何使用证券代码模块指定股票范围和数据起止日期。重要的事情说三遍&#xff1a;模块的输入端口有提示需要连线的上游数据类型&a…

Activiti6工作流引擎:Form表单

表单约等于流程变量。StartEvent 有一个Form属性&#xff0c;用于关联流程中涉及到的业务数据。 一&#xff1a;内置表单 每个节点都可以有不同的表单属性。 1.1 获取开始节点对应的表单 Autowired private FormService formService;Test void delopyProcess() {ProcessEngi…

十八数藏的新时代探索:数字创新助推文化保护

在这个数字化的新时代&#xff0c;传统文化和数字创新的结合呈现出令人振奋的新面貌。十八数藏&#xff0c;作为文化数字创新的佼佼者&#xff0c;正以数字化的手段助推文化的保护与传承。 十八数藏通过数字技术&#xff0c;将传统非物质文化遗产以数字形式呈现&#xff0c;使其…

红黑树-RBTree

目录 1. 红黑树的概念2. 红黑树的性质3. 结点的定义4. 结点的插入5. 整体代码 1. 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式…

Echarts柱状体实现滚动条动态滚动

当我们柱状图中X轴数据太多的时候&#xff0c;会自动把柱形的宽度挤的很细&#xff0c;带来的交互非常不好&#xff0c;因此就有一个属性来解决&#xff1a;dataZoom 第一种简易的版本&#xff0c;横向滚动。 dataZoom: {show: true, // 为true 滚动条出现realtime: true, // 实…

第七章 块为结构建模 P4|系统建模语言SysML实用指南学习

仅供个人学习记录 这部分感觉很模糊&#xff0c;理解的不好&#xff0c;后面的图也没画了&#xff0c;用到的时候再来翻书 应用端口实现接口建模 端口port表示了块边界上的一个访问点&#xff0c;也可以是由该块分类的任何组成或引用边界上的可访问点。一个块可以有多个端口规…

Java学习 10.Java-数组习题

一、创建一个 int 类型的数组, 元素个数为 100, 并把每个元素依次设置为 1 - 100 代码实现 public static void main(String[] args) {int[] arrnew int[100];for (int i 0; i < arr.length; i) {arr[i]i1;}System.out.println(Arrays.toString(arr));} 运行结果 二、改变…

指针传 1

1. 内存 在计算机中内存划分为⼀个个的内存单元&#xff0c;每个内存单元的⼤⼩取1个字节。每个内存单元放了八个bite位&#xff0c;就像我们在高中时住的八人间&#xff0c;那么每个人就代表了一个bite位。 每个内存单元也都有⼀个编号&#xff08;这个编号就相当 于我们所住…

2000-2022年上市公司数字化转型同群效应数据

2000-2022年上市公司数字化转型同群效应数据 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;股票代码、年份、行业代码、行政区划代码、数字化转型程度-A、数字化转型程度-B、同行业同群-数字化转型程度-A_均值、同行业同群-数字化转型程度-A_中位数、同省份同群-数字化…

odoo16 库存初始化 excel导入问题

最近在为一家公司实施odoo时&#xff0c;发现库存模块实施过程中按用户实际&#xff0c;产品初始化就是个问题。下面一一记录下 一个新公司&#xff0c;产品都有上百种&#xff0c;甚致几千种&#xff0c;如何把现有产品数据录入系统就是个不小的活。odoo16是有导入导出功能不…

1994-2021年分行业二氧化碳排放量数据

1994-2021年分行业二氧化碳排放量数据 1、时间&#xff1a;1994-2021年 2、来源&#xff1a;原始数据整理自能源年鉴 3、指标&#xff1a;统计年度、行业代码、行业名称、煤炭二氧化碳排放量、焦炭二氧化碳排放量、原油二氧化碳排放量、汽油二氧化碳排放量、煤油二氧化碳排放…

管理能力测评,如何提升管理能力?

管理能力是综合能力的体现&#xff0c;通常也解读为组织管理能力&#xff0c;如果要再细分的话&#xff0c;可能还包括有沟通能力&#xff0c;协调能力&#xff0c;组织能力&#xff0c;执行力和专业能力等等。不过没有办法说的太细节&#xff0c;因为每个部分铺开了都是一个独…

基于51单片机RFID射频门禁刷卡系统设计

**单片机设计介绍&#xff0c; 基于51单片机RFID射频门禁刷卡系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序程序 六、 文章目录 一 概要 基于51单片机RFID射频门禁刷卡系统&#xff0c;是一种将单片机技术和射频标识技术应用于门禁控制系统的…

自主开发刷题应用网站H5源码(无需后端无需数据库)

该应用使用JSON作为题库的存储方式&#xff0c;层次清晰、结构简单易懂。 配套的word模板和模板到JSON转换工具可供使用&#xff0c;方便将题库从word格式转换为JSON格式。 四种刷题模式包括顺序刷题、乱序刷题、错题模式和背题模式&#xff0c;可以根据自己的需求选择适合的模…

接口--抽象方法

回答问题&#xff1a; 1.接口是什么&#xff1f; 2.接口中可以包含什么内容&#xff1f; 3.如何定义接口格式&#xff1f; 4.接口定义抽象方法格式&#xff1f; Code //接口是公共规范标准&#xff0c;类似于“模具” //如何定义接口格式&#xff1f;/** public interface 接…

写在 Chappyz 即将上所之前:基于 AI 技术对 Web3 营销的重新定义

前不久&#xff0c;一个叫做 Chappyz 的项目&#xff0c;其生态代币 $CHAPZ 在 Seedify、Poolz、Decubate、ChainGPT、Dao Space 等几大 IDO 平台实现了上线后几秒售罄&#xff0c;并且 Bitget、Gate.io、PancakeSwap 等几大平台也纷纷表示支持&#xff0c;并都将在 11 月 13 日…

“目标值排列匹配“和“背包组合问题“的区别和leetcode例题详解

1 目标值排列匹配 1.1 从目标字符串的角度来看&#xff0c;LC139是一个排列问题&#xff0c;因为最终目标子串的各个字符的顺序是固定的&#xff1f; 当我们从目标字符串 s 的角度来看 LC139 “单词拆分” 问题&#xff0c;确实可以认为它涉及到排列的概念&#xff0c;但这种…

Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5)

Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图&#xff0c;Kotlin&#xff08;5&#xff09; import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import android.view.…

单词规律问题

给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern “abba”, s “dog cat cat d…

macOS Sonoma 14.2beta2(23C5041e)发布(附黑白苹果镜像地址)

系统介绍 黑果魏叔11 月 10 日消息&#xff0c;今日向 Mac 电脑用户推送了 macOS 14.2 开发者预览版 Beta 2 更新&#xff08;内部版本号&#xff1a;23C5041e&#xff09;&#xff0c;本次更新距离上次发布隔了 14 天。 macOS Sonoma 14.2 添加了 Music 收藏夹播放列表&…