opencv:灰色和彩色圖像的像素直方圖及直方圖均值化的實現與展示

直方圖及直方圖均值化的理論,實現及展示

直方圖:

首先,我們來看看什么是直方圖:
理論概念:
在圖像處理中,經常用到直方圖,如顏色直方圖、灰度直方圖等。 圖像的灰度直方圖就描述了圖像中灰度分布情況,能夠很直觀的展示出圖像中各個灰度級所 占的多少。 圖像的灰度直方圖是灰度級的函數,描述的是圖像中具有該灰度級的像素的個數:其中,橫 坐標是灰度級,縱坐標是該灰度級出現的頻率。
在這里插入圖片描述
意義:
? 直方圖反映了圖像中的灰度分布規律。它描述每個灰度級具有的像素個數,但不包含 這些像素在圖像中的位置信息。
? 任何一幅特定的圖像都有唯一的直方圖與之對應,但不同的圖像可以有相同的直方圖。
? 如果一幅圖像有兩個不相連的區域組成,并且每個區域的直方圖已知,則整幅圖像的 直方圖是該兩個區域的直方圖之和
在這里插入圖片描述
代碼實現:

import cv2
import numpy as np
from matplotlib import pyplot as plt'''
calcHist—計算圖像直方圖
函數原型:calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None)
images:圖像矩陣,例如:[image]
channels:通道數,例如:0
mask:掩膜,一般為:None
histSize:直方圖大小,一般等于灰度級數
ranges:橫軸范圍
'''
'''
# 灰度圖像直方圖
# 獲取灰度圖像
img = cv2.imread("lenna.png", 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#cv2.imshow("image_gray", gray)# 灰度圖像的直方圖,方法一
plt.figure()
plt.hist(gray.ravel(), 256)
plt.show()'''
'''
# 灰度圖像的直方圖, 方法二
hist = cv2.calcHist([gray],[0],None,[256],[0,256])
plt.figure()#新建一個圖像
plt.title("Grayscale Histogram")
plt.xlabel("Bins")#X軸標簽
plt.ylabel("# of Pixels")#Y軸標簽
plt.plot(hist)
plt.xlim([0,256])#設置x坐標軸范圍
plt.show()
'''#彩色圖像直方圖
image = cv2.imread("lenna.png")
cv2.imshow("Original",image)
#cv2.waitKey(0)chans = cv2.split(image)
colors = ("b","g","r")
plt.figure()
plt.title("Flattened Color Histogram")
plt.xlabel("Bins")
plt.ylabel("# of Pixels")for (chan,color) in zip(chans,colors):hist = cv2.calcHist([chan],[0],None,[256],[0,256])plt.plot(hist,color = color)plt.xlim([0,256])
plt.show()

運行結果:
彩色:
在這里插入圖片描述
灰色:
在這里插入圖片描述

直方圖均值化

由上面的輸出結果,我們很容易發現,像素的分布是不均勻的,我們需要將像素的分布變得均勻,這就用到了直方圖均值化。
概念:
直方圖均衡化是將原圖像的直方圖通過變換函數變為均勻的直方圖,然后按均勻直方圖修改原 圖像,從而獲得一幅灰度分布均勻的新圖像。
直方圖均衡化的作用是圖像增強。
步驟:
為了將原圖像的亮度范圍進行擴展,需要一個映射函數,將原圖像的像素值均衡映射到新直 方圖中,這個映射函數有兩個條件: (1)為了不打亂原有的順序,映射后亮、暗的大小關系不能改變, (2) 映射后必須在原有的范圍內,比如(0-255)
步驟:

  1. 依次掃描原始灰度圖像的每一個像素,計算出圖像的灰度直方圖H
  2. 計算灰度直方圖的累加直方圖
  3. 根據累加直方圖和直方圖均衡化原理得到輸入與輸出之間的映射關系。
  4. 最后根據映射關系得到結果:dst(x,y) = H’(src(x,y))進行圖像變換
    理論公式:
    1.對于輸入圖像的任意一個像素p, p∈[0,255], 總能在輸出圖像里有對應的像素q, q∈[0,255] 使得下面等式成 立(輸入和輸出的像素總量相等):
    在這里插入圖片描述
    2.其中,輸出圖像每個灰度級的個數:
    在這里插入圖片描述
    3.代入累加直方圖公式:
    在這里插入圖片描述
    (因為k是從0開始的,所以是乘(q+1),H和W分別為圖像像素長和寬)
    最后用一張圖來講解一下:
    在這里插入圖片描述
    如左邊黃色55圖像中,像素值從0-9。
    為其建立一個矩陣,pix值從0-9。
    Ni值為該像素值存在的個數,如在5
    5的圖像中,0像素有3個,Ni值為3。
    Pi值為該像素值的概率,在這里插入圖片描述
    sunmPi值就是之前Pi的總和,也可以看作sumPi=Pi+sumP(i-1),比如sumP0=P0=0.12,sumP1=sumP0+P1
    最后的結果就是sumPi×255-1(注意:圖中忘記減一了)*,將這個結果的數值替換原像素數值。
    代碼實現:
import cv2
import numpy as np
from matplotlib import pyplot as plt'''
equalizeHist—直方圖均衡化
函數原型: equalizeHist(src, dst=None)
src:圖像矩陣(單通道圖像)
dst:默認即可
'''# # 獲取灰度圖像
# img = cv2.imread("lenna.png", 1)
# gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# #cv2.imshow("image_gray", gray)
#
# # 灰度圖像直方圖均衡化
# dst = cv2.equalizeHist(gray)
#
# # 直方圖
# hist = cv2.calcHist([dst],[0],None,[256],[0,256])
#
# plt.figure()
# plt.hist(dst.ravel(), 256)
# plt.show()
#
# cv2.imshow("Histogram Equalization", np.hstack([gray, dst]))
# cv2.waitKey(0)# 彩色圖像直方圖均衡化
img = cv2.imread("lenna.png", 1)
cv2.imshow("src", img)# 彩色圖像均衡化,需要分解通道 對每一個通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一個通道
result = cv2.merge((bH, gH, rH))
cv2.imshow("dst_rgb", result)cv2.waitKey(0)chans = cv2.split(result)
colors = ("b","g","r")
plt.figure()
plt.title("Flattened Color Histogram")
plt.xlabel("Bins")
plt.ylabel("# of Pixels")for (chan,color) in zip(chans,colors):hist = cv2.calcHist([chan],[0],None,[256],[0,256])plt.plot(hist,color = color)plt.xlim([0,256])
plt.show()

運行結果:
彩色:在這里插入圖片描述
在這里插入圖片描述
灰色:
在這里插入圖片描述
在這里插入圖片描述
結果對比很明顯像素值變的均勻很多,而且明顯彩色圖像變得更亮了一些。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389556.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql.sock問題

Cant connect to local MySQL server through socket /tmp/mysql.sock 上述提示可能在啟動mysql時遇到,即在/tmp/mysql.sock位置找不到所需要的mysql.sock文件,主要是由于my.cnf文件里對mysql.sock的位置設定導致。 mysql.sock默認的是在/var/lib/mysql,…

交換機的基本原理配置(一)

1、配置主機名 在全局模式下輸入hostname 名字 然后回車即可立馬生效(在生產環境交換機必須有自己唯一的名字) Switch(config)#hostname jsh-sw1jsh-sw1(config)#2、顯示系統OS名稱及版本信息 特權模式下,輸入命令 show version Switch#show …

opencv:卷積涉及的基礎概念,Sobel邊緣檢測代碼實現及Same(相同)填充與Vaild(有效)填充

濾波 線性濾波可以說是圖像處理最基本的方法,它可以允許我們對圖像進行處理,產生很多不同的效果。 卷積 卷積的概念: 卷積的原理與濾波類似。但是卷積卻有著細小的差別。 卷積操作也是卷積核與圖像對應位置的乘積和。但是卷積操作在做乘…

機器學習股票_使用概率機器學習來改善您的股票交易

機器學習股票Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works without seek…

BZOJ 2818 Gcd

傳送門 題解&#xff1a;設p為素數 &#xff0c;則gcd(x/p,y/p)1也就是說求 x&#xff0f;p以及 y&#xff0f;p的歐拉函數。歐拉篩前綴和就可以解決 #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <map&…

LeetCode387-字符串中的第一個唯一字符(查找,自定義數據結構)

一開始想用HashMap&#xff0c;把每個字符放進去&#xff0c;然后統計出現的次數。 使用LinkedHashMap的話&#xff0c;鍵值對的順序都是不會變的。 LinkedHashMap<Character,Integer> map new LinkedHashMap<>();map.put(i,1111);map.put(j,2222);map.put(k,3333…

r psm傾向性匹配_南瓜香料指標psm如何規劃季節性廣告

r psm傾向性匹配Retail managers have been facing an extraordinary time with the COVID-19 pandemic. But the typical plans to prepare for seasonal sales will be a new challenge. More seasonal products have been introduced over the years, making August the bes…

主成分分析:PCA的思想及鳶尾花實例實現

主成份分析算法PCA 非監督學習算法 PCA的實現&#xff1a; 簡單來說&#xff0c;就是將數據從原始的空間中轉換到新的特征空間中&#xff0c;例如原始的空間是三維的(x,y,z)&#xff0c;x、y、z分別是原始空間的三個基&#xff0c;我們可以通過某種方法&#xff0c;用新的坐…

兩家大型網貸平臺竟在借款人審核問題上“偷懶”?

python信用評分卡&#xff08;附代碼&#xff0c;博主錄制&#xff09; https://study.163.com/course/introduction.htm?courseId1005214003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 放貸流量增加&#xff0c;逾期率也會隨之增加&…

解決 Alfred 每次開機都提示請求通訊錄權限的問題

安裝完 Alfred 以后&#xff0c;每次開機都會提示請求通訊錄權限&#xff0c;把設置里的通訊錄關掉也沒用&#xff0c;每次都提示又非常煩人&#xff0c;這里把解決方法記錄一下。 依次打開 應用程序 - Alfred 3.app - 右鍵顯示包內容 - Contents - Frameworks - Alfred Framew…

【轉】DCOM遠程調用權限設置

原文&#xff1a;https://blog.csdn.net/ervinsas/article/details/36424127 最近幾天被搞得焦頭爛額&#xff0c;由于DCOM客戶端程序是在32位系統下開發的&#xff0c;調試時DCOM服務端也是安裝在同一臺機器上&#xff0c;所有過程一直還算順利。可這次項目實施的時候&#xf…

opencv:邊緣檢測之Laplacian算子思想及實現

Laplacian算子邊緣檢測的來源 在邊緣部分求取一階導數&#xff0c;你會看到極值的出現&#xff1a; 如果在邊緣部分求二階導數會出現什么情況? 從上例中我們可以推論檢測邊緣可以通過定位梯度值大于鄰域的相素的方法找到(或者推廣到大 于一個閥值). 從以上分析中&#xff0c…

使用機器學習預測天氣_如何使用機器學習預測著陸

使用機器學習預測天氣Based on every NFL play from 2009–2017根據2009-2017年每場NFL比賽 Ah, yes. The times, they are changin’. The leaves are beginning to fall, the weather is slowly starting to cool down (unless you’re where I’m at in LA, where it’s on…

laravel 導出插件

轉發&#xff1a;https://blog.csdn.net/gu_wen_jie/article/details/79296470 版本&#xff1a;laravel5 php 5.6 安裝步驟&#xff1a; 一、安裝插件 ①、首先在Laravel項目根目錄下使用Composer安裝依賴&#xff1a; composer require "maatwebsite/excel:~2.1.0"…

國外 廣告牌_廣告牌下一首流行歌曲的分析和預測,第1部分

國外 廣告牌Using Spotify and Billboard’s data to understand what makes a song a hit.使用Spotify和Billboard的數據來了解歌曲的流行。 Thousands of songs are released every year around the world. Some are very successful in the music industry; others less so…

Jmeter測試普通java類說明

概述 Apache JMeter是Apache組織開發的基于Java的壓力測試工具。本文檔主要描述用Jmeter工具對基于Dubbo、Zookeeper框架的Cassandra接口、區塊鏈接口進行壓力測試的一些說明&#xff0c;為以后類似接口的測試提供參考。 環境部署 1、 下載Jmeter工具apache-jmeter-3.3.zip&am…

opencv:Canny邊緣檢測算法思想及實現

Canny邊緣檢測算法背景 求邊緣幅度的算法&#xff1a; 一階導數&#xff1a;sobel、Roberts、prewitt等算子 二階導數&#xff1a;Laplacian、Canny算子 Canny算子效果比其他的都要好&#xff0c;但是實現起來有點麻煩 Canny邊緣檢測算法的優勢&#xff1a; Canny是目前最優…

關于outlook簽名圖片大小的說明

96 dpiwidth576 height114轉載于:https://blog.51cto.com/lch54734/2298115

opencv:畸變矯正:透視變換算法的思想與實現

畸變矯正 注意&#xff1a;雖然能夠成功矯正但是也會損失了部分圖像&#xff01; 透視變換(Perspective Transformation) 概念&#xff1a; 透視變換是將圖片投影到一個新的視平面(Viewing Plane)&#xff0c;也稱作投影映射(Projective Mapping)。 我們常說的仿射變換是透視…

數據多重共線性_多重共線性對您的數據科學項目的影響比您所知道的要多

數據多重共線性Multicollinearity is likely far down on a mental list of things to check for, if it is on a list at all. This does, however, appear almost always in real-life datasets, and it’s important to be aware of how to address it.多重共線性可能根本不…