图像处理[二值化]

 

图像二值化在图像处理中具有多种作用,包括但不限于以下几个方面:

  1. 分割图像:将图像分为目标和背景两部分,使得目标与背景的区分更加清晰,便于后续的图像分析和处理。

  2. 特征提取:二值化可以突出图像中的一些特征,如边缘、纹理等,有利于后续的特征提取和图像识别。

  3. 减少数据量:将图像转换为二值图像可以大大减少数据量,节省存储和传输成本。

  4. 图像增强:通过二值化可以突出感兴趣的目标,增强图像的对比度和特征,使得图像更加清晰和易于分析。

  5. 图像预处理:在一些图像处理任务中,如字符识别、图像分割等,二值化是一种常用的预处理方法,可以提高后续处理的准确性和效率。

总的来说,图像二值化的作用主要是对图像进行分割、特征提取和增强,以便于后续的图像分析和处理。

图像处理二值化介绍

下面是Python脚本,主要用于使用OpenCV库读取图像并进行简单的二值化处理,然后使用matplotlib库展示原始图像和处理后的图像。

# -*-coding:GBK -*-
# coding = utf-8
import cv2
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import math

具体功能如下:

  1. # -*-coding:GBK-*-:这是注释,用于指定文件的编码格式为GBK,但是由于后面有# coding = utf-8,因此实际上会使用UTF-8编码。

  2. 导入所需的库:

    • cv2:OpenCV库,用于图像处理。
    • matplotlib.pyplotmatplotlib:用于绘制图像。
    • numpy:用于处理图像数据。
  3. 读取图像:使用cv2.imread()函数读取图像文件,该函数会返回一个表示图像的多维数组。

  4. 灰度处理:使用cv2.cvtColor()函数将读取的彩色图像转换为灰度图像。

  5. 二值化处理:使用自定义的二值化方法对灰度图像进行二值化处理。

  6. 展示图像:使用matplotlib.pyplot.imshow()函数分别展示原始图像和处理后的图像。

需要注意的是,如果解释器中没有相应的文件脚本,需要使用pip命令下载。

目录

  1. 灰度值返图最大熵法
  2. 迭代法
  3. 自适应法
  4. OTSU阈值处理法

1. 灰度值返图最大熵法

灰度值返图最大熵法是一种基于最大熵原理的二值化方法。它的原理是通过最大化图像的熵来确定最佳的阈值,从而将图像二值化。其步骤如下:

1.1 确定灰度直方图

首先,计算图像的灰度直方图,即统计每个灰度级别的像素点个数。

1.2 计算图像熵

根据灰度直方图,计算图像的熵。图像的熵可以用以下公式表示: [ H = -\sum_{i=0}^{L-1} p_i \log(p_i) ] 其中,( p_i ) 是第i个灰度级别的像素点数占总像素点数的比例,L是灰度级别的数量。

1.3 寻找最大熵

通过遍历所有可能的阈值,计算每个阈值对应的图像熵,找到使图像熵最大的阈值作为最佳的二值化阈值。

def threshEntropy(image):
   rows, cols = image.shape
   #求灰度直方图
   grayHist = caleGrayHist(image)
   #归一化灰度直方图,即概率直方图
   normGrayHist = grayHist/float(rows*cols)
    
   #第一步:计算累加直方图,也成为零阶累矩阵
   zeroCumuMoment = np.zeros([256], np.float32)
   for k in range(256):
       if k == 0 :
           zeroCumuMoment[k] = normGrayHist[k]
       else:
           zeroCumuMoment[k] = zeroCumuMoment[k-1] + normGrayHist[k]
   #第二步:计算各个灰度级的熵
   entropy = np.zeros([256], np.float32)
   for k in range(256):
       if k == 0 :
           if normGrayHist[k] == 0 :     
               entropy[k] = 0
           else:
               entropy[k] = - normGrayHist[k] * math.log10(normGrayHist[k])
       else:
           if normGrayHist[k] == 0 :
               entropy[k] = entropy[k-1]
           else:
               entropy[k] = entropy[k-1] - normGrayHist[k] * math.log10(normGrayHist[k])
   #第三步:找阈值
   fT = np.zeros([256], np.float32)
   ft1, ft2 = 0.0, 0.0
   totalEntropy = entropy[255]
   for k in range(255):
       #找最大值
       maxFront = np.max(normGrayHist[0:k+1])
       maxBack = np.max(normGrayHist[k+1:256])
       if maxFront==0 or zeroCumuMoment[k]==0 or maxFront==1 or zeroCumuMoment[k]==1 or totalEntropy==0 :
           ft1 = 0
       else:
           ft1 = entropy[k]/totalEntropy*(math.log10(zeroCumuMoment[k])/math.log10(maxFront))
       if maxBack==0 or 1-zeroCumuMoment[k]==0 or maxBack==1 or 1-zeroCumuMoment[k]==1 :
           ft2 = 0
       else:
           if totalEntropy == 0 :
               ft2 = (math.log10(1-zeroCumuMoment[k])/math.log10(maxBack))
           else:
               ft2 = (1-entropy[k]/totalEntropy)*(math.log10(1-zeroCumuMoment[k])/math.log10(maxBack))
       fT[k] = ft1 + ft2
    
   #找到最大值索引
   threshLoc = np.where(fT==np.max(fT))
   thresh = threshLoc[0][0]
   #阈值处理
   threshold = np.copy(image)
   threshold[threshold > thresh] = 255
   threshold[threshold <= thresh] = 0
    
   return (thresh, threshold)
    
img = cv2.imread('median.jpg', cv2.IMREAD_GRAYSCALE)
the, dst4 = threshEntropy(img)
the1 = 0
maxval = 255 
the1, dst1 = cv2.threshold(img, the1, maxval, cv2.THRESH_TRIANGLE + cv2.THRESH_BINARY)
print('The thresh is :', the)
print('The thresh1 is :', the1)
cv2.imshow("image", img)
cv2.imshow('thresh_out', dst4)
cv2.imshow('thresh_out1', dst1)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('最大熵.jpg',dst1)

2. 迭代法

迭代法是一种简单直观的二值化方法。其步骤如下:

2.1 初始化阈值

首先,初始化一个阈值T。

2.2 计算两个类的平均灰度

根据阈值T,将图像分为两个类,分别计算两个类的平均灰度值。

2.3 更新阈值

将两个类的平均灰度值的平均值作为新的阈值T,重复步骤2.2,直到阈值不再变化为止。

def show(img):
   if img.ndim == 2:
       plt.imshow(img, cmap='gray', vmin=0, vmax=255)
   else:
       img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
       plt.imshow(img)
   plt.show()

img = cv2.imread('median.jpg', 0)

T = img.mean()

while True:
   t0 = img[img < T].mean()
   t1 = img[img >= T].mean()
   t  = (t0 + t1) / 2
   if abs(T - t) < 1:
       break
   T = t
T = int(T)

print(f"Best threshold = {T}")
th, img_bin = cv2.threshold(img, T, 255, 0)
cv2.imshow('thresh_out1', img_bin)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('迭代.jpg',img_bin)

3. 自适应法

自适应法是一种根据局部像素灰度分布自适应调整阈值的二值化方法。其步骤如下:

3.1 确定局部窗口大小

首先,确定一个局部窗口的大小。

3.2 计算局部阈值

对于图像中的每个像素点,以其为中心取局部窗口,计算局部窗口内的灰度均值作为该像素点的阈值。

3.3 二值化

根据计算得到的局部阈值,对图像进行二值化处理。

img = cv2.imread('median.jpg', cv2.IMREAD_GRAYSCALE)
dst = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 43, 0.15)
cv2.imshow("image", img)
cv2.imshow('thresh_out', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('自适应.jpg',dst)

4. OTSU阈值处理

OTSU阈值处理法是一种基于类间方差最大化的二值化方法。其步骤如下:

4.1 计算类间方差

遍历所有可能的阈值,计算每个阈值对应的类间方差,找到使类间方差最大的阈值作为最佳的二值化阈值。

4.2 二值化

根据最佳的二值化阈值,对图像进行二值化处理。

以上就是对图像处理二值化的介绍,包括灰度值返图最大熵法、迭代法、自适应法、OTSU阈值处理法的详细说明和公式。希望能帮助你更好地理解图像二值化的原理和方法。

src = cv2.imread('image_bilater.jpg', cv2.IMREAD_GRAYSCALE)
 
triThe = 0
maxval = 255
triThe, dst_tri2 = cv2.threshold(src, triThe, maxval, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
triThe1, dst_tri1 = cv2.threshold(src, triThe, maxval, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)
print (triThe)
print (triThe1)
cv2.imshow("image", src)
cv2.imshow('thresh_out', dst_tri2)
cv2.imshow('thresh_out1', dst_tri1)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('image_otsu.jpg',dst_tri2)

FPGA图像处理二值化是指使用FPGA芯片对图像进行处理,将图像转化为二值图像。二值图像是指每个像素只有两种可能的取值或灰度等级状态,通常用黑白、B&W、单色图像表示。在二值化过程中,需要将图像的灰度值与预设的阈值进行比较,比较结果以0和1的形式存入monoc中。如果灰度值大于阈值,像素点赋值为1,否则赋值为0。 以下是一个FPGA的二值化处理的源码示例: ```verilog module binarization( input clk, // 时钟信号 input rst_n, // 复位信号 input ycbcr_vsync, // 输入YCbCr图像的垂直同步信号 input ycbcr_hsync, // 输入YCbCr图像的水平同步信号 input [7:0 luminance, // 输入图像的亮度值 output post_vsync, // 输出二值化后的垂直同步信号 output post_hsync, // 输出二值化后的水平同步信号 output post_de, // 输出二值化后的数据使能信号 output reg monoc // 输出二值化后的像素值 ); // reg定义 reg ycbcr_vsync_d; reg ycbcr_hsync_d; reg ycbcr_de_d; // 同步时钟信号 assign post_vsync = ycbcr_vsync_d; assign post_hsync = ycbcr_hsync_d; assign post_de = ycbcr_de_d; // 二值化处理 always @(posedge clk or negedge rst_n) begin if(!rst_n) monoc <= 1'b0; else if(luminance > 8'd64) // 灰度阈值 monoc <= 1'b1; // 低于阈值时赋1 else monoc <= 1'b0; // 高于阈值时赋0 end // 延时1拍以同步时钟信号 always @(posedge clk or negedge rst_n) begin if(!rst_n) begin ycbcr_vsync_d <= 1'd0; ycbcr_hsync_d <= 1'd0; ycbcr_de_d <= 1'd0; end else begin ycbcr_vsync_d <= ycbcr_vsync; ycbcr_hsync_d <= ycbcr_hsync; ycbcr_de_d <= ycbcr_de; end end endmodule ``` 以上是一个简单的二值化处理的FPGA图像处理代码,它通过比较输入图像的亮度值与预设的阈值来决定输出像素值是1还是0,并保持同步时钟信号不变,实现二值化处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [FPGA丨图像二值化](https://blog.csdn.net/qq_39507748/article/details/115293728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [FPGA|数字图像处理实现口罩识别——二值化](https://blog.csdn.net/mintshoot_/article/details/127387021)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值