1. 程式人生 > 其它 >python灰度圖uint8_opencv分量法、加權平均法、最大值法、平均值法灰度化

python灰度圖uint8_opencv分量法、加權平均法、最大值法、平均值法灰度化

技術標籤:python灰度圖uint8

有問題新增QQ群:686070107

一. c++實現

1. Opencv 分量法灰度化

分量法的主要思想便是取彩色影象三通道其中的任意一個通道分量,將它作為灰度影象的灰度值,按照現實應用選擇一個通道。

981458c208093b14cc07ed7889ba23d5.png

實現:

//此處更改圖片地址  
src = imread("img/4.png");
imshow("原圖", src);
Mat gray(src.rows, src.cols, CV_8UC1, Scalar(0));
Mat gray1(src.rows, src.cols, CV_8UC1, Scalar(0));
Mat gray2(src.rows, src.cols, CV_8UC1, Scalar(0));
float R, G, B;
//每行迴圈處理
for (int y = 0; y < src.rows; y++) {
    uchar* data1 = gray.ptr<uchar>(y);
    uchar* data2 = gray1.ptr<uchar>(y);
    uchar* data3 = gray2.ptr<uchar>(y);
    for (int x = 0; x < src.cols; x++) {//列
        B = src.at<Vec3b>(y, x)[0];
        G = src.at<Vec3b>(y, x)[1];
        R = src.at<Vec3b>(y, x)[2];
        data1[x] = B;
        data2[x] = G;
        data3[x] = R;
    }
}
imshow("分量法灰度圖1", gray);
imshow("分量法灰度圖2", gray1);
imshow("分量法灰度圖3", gray2);

2. Opencv 加權平均法灰度化

按照各個通道的重要性將彩色影象的三通道分量進行加權平均,再把得到的加權平均值作為灰度影象的灰度值,本次設計採用的灰度化方式便是用的加權平均法。

27c3db170749be958174425dca5cdb51.png

實現:

src = imread("img/4.png");
imshow("原圖", src);
Mat gray1 = Mat(src.rows, src.cols, CV_8UC1);
float R, G, B;
for (int y = 0; y < src.rows; y++)
{
    uchar* data1 = gray1.ptr<uchar>(y);
    for (int x = 0; x < src.cols; x++)
    {
        B = src.at<Vec3b>(y, x)[0];
        G = src.at<Vec3b>(y, x)[1];
        R = src.at<Vec3b>(y, x)[2];
        data1[x] = (int)(R * 0.299 + G * 0.587 + B * 0.114);//利用公式計算灰度值(加權平均法)
    }
}
imshow("加權平均法灰度圖1", gray1);

3. Opencv 最大值法灰度化

最大值法便是求得彩色影象三通道分量中的最大值,再把求得的這個最大值作為灰度圖的灰度值。

943599e471e8c639ace4a04e2d679f27.png

實現:

src = imread("img/4.png");
imshow("原圖", src);
Mat gray2 = Mat(src.rows, src.cols, CV_8UC1);
for (int y = 0; y < src.rows; y++)
{
    uchar* data2 = gray2.ptr<uchar>(y);
    for (int x = 0; x < src.cols; x++)
    {
        B = src.at<Vec3b>(y, x)[0];
        G = src.at<Vec3b>(y, x)[1];
        R = src.at<Vec3b>(y, x)[2];
        data2[x] = (int)(B >= G && B >= R) ? B : (G >= B && G >= R) ? G : R;//最大值法
    }
}
imshow("最大值法灰度圖2", gray2);

4. Opencv 平均值法灰度化

平均值法便是取彩色影象三通道分量的平均值,再將得到的這個平均值作為灰度影象的灰度值。

552ddd58ed4d5a1b16eed00d6c57acbc.png

實現:

src = imread("img/4.png");
Mat gray3 = Mat(src.rows, src.cols, CV_8UC1);
for (int y = 0; y < src.rows; y++)
{
    uchar* data3 = gray3.ptr<uchar>(y);
    for (int x = 0; x < src.cols; x++)
    {
        B = src.at<Vec3b>(y, x)[0];
        G = src.at<Vec3b>(y, x)[1];
        R = src.at<Vec3b>(y, x)[2];
        data3[x] = (int)(R + G + B) / 3;//平均值法
    }
}
imshow("平均值法灰度圖3", gray3);

二. python實現

1. Opencv 分量法灰度化

分量法的主要思想便是取彩色影象三通道其中的任意一個通道分量,將它作為灰度影象的灰度值,按照現實應用選擇一個通道。

981458c208093b14cc07ed7889ba23d5.png

實現:

#encoding:utf-8
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取原始影象
img = cv2.imread('miao.png')
b = image[:, :, 0]
g = image[:, :, 1]
r = image[:, :, 2]
#也可以直接用opencv的split函式
#(b, g, r) = cv2.split(image)
cv2.imshow("b", b)
cv2.imshow("g", g)
cv2.imshow("r", r)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

2. Opencv 加權平均法灰度化

按照各個通道的重要性將彩色影象的三通道分量進行加權平均,再把得到的加權平均值作為灰度影象的灰度值,本次設計採用的灰度化方式便是用的加權平均法。

27c3db170749be958174425dca5cdb51.png

實現:

#encoding:utf-8
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取原始影象
img = cv2.imread('miao.png')

#獲取影象高度和寬度
height = img.shape[0]
width = img.shape[1]

#建立一幅影象
grayimg = np.zeros((height, width, 1), np.uint8)
#影象平均灰度處理方法
for i in range(height):
    for j in range(width):
        #灰度加權平均法
        grayimg[i,j]= 0.299 * img[i,j][0] + 0.587 * img[i,j][1] + 0.114 * img[i,j][2]

#顯示影象
cv2.imshow("src", img)
cv2.imshow("gray", grayimg)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

3. Opencv 最大值法灰度化

最大值法便是求得彩色影象三通道分量中的最大值,再把求得的這個最大值作為灰度圖的灰度值。

943599e471e8c639ace4a04e2d679f27.png

實現:

#encoding:utf-8
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取原始影象
img = cv2.imread('miao.png')

#獲取影象高度和寬度
height = img.shape[0]
width = img.shape[1]
#建立一幅影象
grayimg = np.zeros((height, width, 3), np.uint8)
#影象最大值灰度處理
for i in range(height):
    for j in range(width):
        #獲取影象R G B最大值
        grayimg[i,j] = max(img[i,j][0], img[i,j][1], img[i,j][2])
#顯示影象
cv2.imshow("src", img)
cv2.imshow("gray", grayimg)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

4. Opencv 平均值法灰度化

平均值法便是取彩色影象三通道分量的平均值,再將得到的這個平均值作為灰度影象的灰度值。

552ddd58ed4d5a1b16eed00d6c57acbc.png

實現:

#encoding:utf-8
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取原始影象
img = cv2.imread('miao.png')

#獲取影象高度和寬度
height = img.shape[0]
width = img.shape[1]
#建立一幅影象
grayimg = np.zeros((height, width, 3), np.uint8)
#影象平均灰度處理方法
for i in range(height):
    for j in range(width):
        #灰度值為RGB三個分量的平均值
        grayimg[i,j]= (int(img[i,j][0]) + int(img[i,j][1]) + int(img[i,j][2]))  /  3
#顯示影象
cv2.imshow("src", img)
cv2.imshow("gray", grayimg)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()