IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 十一、图像二值化 -> 正文阅读

[人工智能]十一、图像二值化

一、二值图像

其实就是把图像转换为只有黑白的两种颜色图像,即像素值非零即一

三角阈值二值化

对一个图像进行操作,获取图像的直方图,找到波峰和波谷进行连线设为线段A,每个点做有关线段A的垂线垂足在线段A上,最后将所有的垂足的横坐标累加再加上一个偏量位移得到的值也就是图像的阈值,通过这个阈值对整个图像进行二值化操作。

二、图像二值化的方法

1、全局阈值

OTSU:内方差最小,外方差最大(常用)

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


def threshold(image):
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
    print("threshold value is:%s"%ret)
    cv2.imshow("OTSU",binary)


src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)

threshold(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述
在这里插入图片描述

Triangle

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


def threshold(image):
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_TRIANGLE)
    print("threshold value is:%s"%ret)
    cv2.imshow("TRIANGLE",binary)


src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)

threshold(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述

在这里插入图片描述

自动与手动设置阈值

THRESH_BINARY手动设置阈值为127,像素值小于127为0黑色,大于127为255白色

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


def threshold(image):
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    ret,binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
    print("threshold value is:%s"%ret)
    cv2.imshow("binary",binary)


src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)

threshold(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述
在这里插入图片描述
THRESH_BINARY_INV手动设置阈值为127,取反效果,像素值小于127为255白色,大于127为0黑色

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


def threshold(image):
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    ret,binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
    print("threshold value is:%s"%ret)
    cv2.imshow("binary",binary)


src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)

threshold(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述
在这里插入图片描述
THRESH_TRUNC手动设置阈值为127,截断,像素值大于127为127,小于127为0黑色

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


def threshold(image):
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    ret,binary = cv2.threshold(gray,127,255,cv2.THRESH_TRUNC)
    print("threshold value is:%s"%ret)
    cv2.imshow("TRUNC",binary)


src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)

threshold(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述
在这里插入图片描述
THRESH_TOZERO手动设置阈值为127,截断,像素值小于127为0黑色,大于127像素值不变

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


def threshold(image):
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    ret,binary = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)
    print("threshold value is:%s"%ret)
    cv2.imshow("TOZERO",binary)


src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)

threshold(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述

在这里插入图片描述

2、局部阈值

Ⅰ局部自适应阈值方法

①THRESH_MEAN_C

MEAN_C:将图片分为若干个小方格,求出每一个方格中像素的均值,判断均值是否大于自定义的阈值,大于阈值为白色,小于阈值为黑色
adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,25,10)
gray必须为灰度图
255为maxValue
25为blockSize,必须是奇数
10为C,是一个常量,每个像素块的均值与计算出来的均值差不能大于10,否则视为无效,其目的为了防止噪声的影响

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


def local_threshold(image):
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    binary = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,25,10)
    cv2.imshow("MEAN_C",binary)


src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)

local_threshold(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述

②THRESH_GAUSSIAN_C

GAUSSIAN_C:将图片分为若干个小方格,求出每一个方格中像素的均值并乘以相应的高斯权重(中间的权重更大),判断均值是否大于自定义的阈值,大于阈值为白色,小于阈值为黑色
adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,25,10)
gray必须为灰度图
255为maxValue
25为blockSize,必须是奇数
10为C,是一个常量,每个像素块的均值与计算出来的均值差不能大于10,否则视为无效,其目的为了防止噪声的影响

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


def local_threshold(image):
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    binary = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,25,10)
    cv2.imshow("binary",binary)

src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
local_threshold(src)
cv2.waitKey(0)
cv2.destroyAllWindows()**

效果图如下:
在这里插入图片描述

Ⅱ自己计算均值然后对图像进行分割从而达到图像二值化效果

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


def custom_threshold(image):
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    h,w = gray.shape[:2]
    m = np.reshape(gray,[1,h*w])
    mean = m.sum()/h*w
    print("mean:",mean)
    ret ,binary = cv2.threshold(gray,mean,255,cv2.THRESH_BINARY)
    cv2.imshow("binary",binary)


src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)

custom_threshold(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述
在这里插入图片描述

三、超大图像二值化

Ⅰ自动全局方法操作

思想:对超大图像进行分块二值化操作

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


def big_image_binary(image):
    print(image.shape)
    cw = 256
    ch = 256
    h,w = image.shape[:2]
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    for row in range(0,h,ch):
        for col in range(0,w,cw):
            roi = gray[row:row+ch,col:col+cw]
            ret,dst = cv2.threshold(roi,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
            gray[row:row+ch,col:col+cw] = dst
            print(np.std(dst),np.mean(dst))
    cv2.imwrite(r"G:\Juptyer_workspace\study\opencv\opencv3\big1.jpg",gray)


src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\big.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
big_image_binary(src)


cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对图像噪声进行过滤之后进行全局二值化操作

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


def big_image_binary(image):
    print(image.shape)
    cw = 256
    ch = 256
    h,w = image.shape[:2]
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    for row in range(0,h,ch):
        for col in range(0,w,cw):
            roi = gray[row:row+ch,col:col+cw]
            print(np.std(roi),np.mean(roi))
            dev = np.std(roi)
            if dev < 15:
                gray[row:row+ch,col:col+cw] = 255
            else :
                ret,dst = cv2.threshold(roi,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
                gray[row:row+ch,col:col+cw] = dst
               
    cv2.imwrite(r"G:\Juptyer_workspace\study\opencv\opencv3\big3.jpg",gray)


src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\big.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
big_image_binary(src)


cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Ⅱ自适应局部方法操作

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


def big_image_binary(image):
    print(image.shape)
    cw = 256
    ch = 256
    h,w = image.shape[:2]
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    for row in range(0,h,ch):
        for col in range(0,w,cw):
            roi = gray[row:row+ch,col:col+cw]
            dst = cv2.adaptiveThreshold(roi,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,127,20)
            gray[row:row+ch,col:col+cw] = dst
            print(np.std(dst),np.mean(dst))
    cv2.imwrite(r"G:\Juptyer_workspace\study\opencv\opencv3\big2.jpg",gray)


src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\big.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
big_image_binary(src)


cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:02:58  更:2022-04-01 00:06:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 0:28:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码