昨天看到一個模糊算法介紹,感覺挺有趣的正好用到就實驗了一下
很多概念都是模糊的,如果把像素的概念模糊化,有時候可以這種模糊解決很多實際問題,比如增強圖檔對比度
讓黑的更黑亮的更亮灰的微處理
但是這個局限性有點大,适合處理對比度不大的圖檔
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
Mat img;
float* findValue(float intensity) {
float* value = new float[3];
if (intensity <= 0.27) {
value[0] = 1.0; //黑
}
if (intensity >= 0.5) {
value[0] = 0.0;
}
else {
value[0] = (0.5 - intensity) / (0.22);
}
if (intensity >= 0.72) {
value[1] = 1.0; //白
}
if (intensity <= 0.5) {
value[1] = 0;
}
else {
value[1] = (intensity - 0.5) / 0.22;
}
if (intensity >= 0.72) {
value[2] = 0.0; //灰
}
if (intensity <= 0.27) {
value[2] = 0.0;
}
if (intensity <= 0.5) {
value[2] = (intensity - 0.27) / 0.22;
}
else {
value[2] = (0.72 - intensity) / 0.22;
}
return value;
}
void dealValue() {
float* value = new float[3];
for (int i = 0; i < img.rows; i++) {
float* pr = img.ptr<float>(i);
for (int j = 0; j < img.cols; j++) {
for (int k = 0; k < 3; k++) {
value = findValue(pr[j * 3 + k]);
pr[j * 3 + k] = ((value[0] * 0) + (value[2] * 0.5) + (value[1] * 1)) / (value[0] + value[1] + value[2]);
}
}
}
delete[]value;
}
void histogramcalculation(const Mat & img, Mat & histoImage)
{
int histSize = 255;
float range[] = { 0,256 };
const float* histRange = { range };
bool uniform = true;
bool accumulate = false;
Mat b_hist, g_hist, r_hist;
vector<Mat> bgr_channels;
split(img, bgr_channels);
calcHist(&bgr_channels[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_channels[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_channels[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate);
int hist_w = 600, hist_h = 400;
int bin_w = cvRound((double)hist_w / histSize);
Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(120, 55, 133));
normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
for (int i = 1; i < histSize; i++) {
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))), Point(bin_w*i, hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2);
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))), Point(bin_w*i, hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2);
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))), Point(bin_w*i, hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2);
}
histoImage = histImage;
}
int main() {
img = imread("D://圖檔//999.jpg");
if (img.empty()) {
return -1;
}
Mat result1(img.size(), img.type());
Mat result2(img.size(), img.type());
imshow("org", img);
histogramcalculation(img, result1);
imshow("result1", result1);
img.convertTo(img, CV_32F, 1 / 255.0);
// int num = 30;
// while (num--) {
dealValue();
//}
img.convertTo(img, CV_32F, 255.0);
histogramcalculation(img, result2);
imshow("result2", result2);
img.convertTo(img, CV_8U);
imshow("result", img);
waitKey(0);
return 0;
}
對比強的圖檔效果:

可以看出雖然圖檔均衡了,但是品質變差了
對比度不好的:
因為我處理範例圖檔時不是對比度,是以效果不是那麼明顯