python灰度圖uint8_opencv分量法、加權平均法、最大值法、平均值法灰度化
阿新 • • 發佈:2021-02-14
技術標籤:python灰度圖uint8
有問題新增QQ群:686070107
一. c++實現
1. Opencv 分量法灰度化
分量法的主要思想便是取彩色影象三通道其中的任意一個通道分量,將它作為灰度影象的灰度值,按照現實應用選擇一個通道。
實現:
//此處更改圖片地址 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 加權平均法灰度化
按照各個通道的重要性將彩色影象的三通道分量進行加權平均,再把得到的加權平均值作為灰度影象的灰度值,本次設計採用的灰度化方式便是用的加權平均法。
實現:
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 最大值法灰度化
最大值法便是求得彩色影象三通道分量中的最大值,再把求得的這個最大值作為灰度圖的灰度值。
實現:
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 平均值法灰度化
平均值法便是取彩色影象三通道分量的平均值,再將得到的這個平均值作為灰度影象的灰度值。
實現:
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 分量法灰度化
分量法的主要思想便是取彩色影象三通道其中的任意一個通道分量,將它作為灰度影象的灰度值,按照現實應用選擇一個通道。
實現:
#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 加權平均法灰度化
按照各個通道的重要性將彩色影象的三通道分量進行加權平均,再把得到的加權平均值作為灰度影象的灰度值,本次設計採用的灰度化方式便是用的加權平均法。
實現:
#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 最大值法灰度化
最大值法便是求得彩色影象三通道分量中的最大值,再把求得的這個最大值作為灰度圖的灰度值。
實現:
#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 平均值法灰度化
平均值法便是取彩色影象三通道分量的平均值,再將得到的這個平均值作為灰度影象的灰度值。
實現:
#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()