본문 바로가기

OpenCV

ch07 noise

#python code

import cv2
import numpy as np

def noise_gaussian():
    src = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch07\\noise\\lenna.bmp", cv2.IMREAD_GRAYSCALE)

    if src is None:
        print("Image load failed!")
        return

    cv2.imshow("src", src)

    for stddev in range(10, 31, 10):
        noise = np.zeros(src.shape, np.int32)
        cv2.randn(noise, 0, stddev)

        dst = cv2.add(src, noise, dtype=cv2.CV_8U)

        desc = "stddev = {}".format(stddev)
        cv2.putText(dst, desc, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, 255, 1, cv2.LINE_AA)
        cv2.imshow("dst", dst)
        cv2.waitKey()

    cv2.destroyAllWindows()

def filter_bilateral():
    src = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch07\\noise\\lenna.bmp", cv2.IMREAD_GRAYSCALE)

    if src is None:
        print("Image load failed!")
        return

    noise = np.zeros(src.shape, np.int32)
    cv2.randn(noise, 0, 5)
    src = cv2.add(src, noise, dtype=cv2.CV_8U)

    dst1 = cv2.GaussianBlur(src, (0, 0), 5)
    dst2 = cv2.bilateralFilter(src, -1, 10, 5)

    cv2.imshow("src", src)
    cv2.imshow("dst1", dst1)
    cv2.imshow("dst2", dst2)

    cv2.waitKey()
    cv2.destroyAllWindows()

def filter_median():
    src = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch07\\noise\\lenna.bmp", cv2.IMREAD_GRAYSCALE)

    if src is None:
        print("Image load failed!")
        return

    num = int(src.size * 0.1)
    for i in range(num):
        x = np.random.randint(0, src.shape[1])
        y = np.random.randint(0, src.shape[0])
        src[y, x] = (i % 2) * 255

    dst1 = cv2.GaussianBlur(src, (0, 0), 1)
    dst2 = cv2.medianBlur(src, 3)

    cv2.imshow("src", src)
    cv2.imshow("dst1", dst1)
    cv2.imshow("dst2", dst2)

    cv2.waitKey()
    cv2.destroyAllWindows()

def main():
    noise_gaussian()
    filter_bilateral()
    filter_median()

if __name__ == "__main__":
    main()

// C++ code


#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

void noise_gaussian();
void filter_bilateral();
void filter_median();

int main(void)
{
	noise_gaussian();
	filter_bilateral();
	filter_median();

	return 0;
}

void noise_gaussian()
{
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	imshow("src", src);

	for (int stddev = 10; stddev <= 30; stddev += 10) {
		Mat noise(src.size(), CV_32SC1);
		randn(noise, 0, stddev);

		Mat dst;
		add(src, noise, dst, Mat(), CV_8U);

		String desc = format("stddev = %d", stddev);
		putText(dst, desc, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255), 1, LINE_AA);
		imshow("dst", dst);
		waitKey();
	}

	destroyAllWindows();
}

void filter_bilateral()
{
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	Mat noise(src.size(), CV_32SC1);
	randn(noise, 0, 5);
	add(src, noise, src, Mat(), CV_8U);

	Mat dst1;
	GaussianBlur(src, dst1, Size(), 5);

	Mat dst2;
	bilateralFilter(src, dst2, -1, 10, 5);

	imshow("src", src);
	imshow("dst1", dst1);
	imshow("dst2", dst2);

	waitKey();
	destroyAllWindows();
}

void filter_median()
{
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	int num = (int)(src.total() * 0.1);
	for (int i = 0; i < num; i++) {
		int x = rand() % src.cols;
		int y = rand() % src.rows;
		src.at<uchar>(y, x) = (i % 2) * 255;
	}

	Mat dst1;
	GaussianBlur(src, dst1, Size(), 1);

	Mat dst2;
	medianBlur(src, dst2, 3);

	imshow("src", src);
	imshow("dst1", dst1);
	imshow("dst2", dst2);

	waitKey();
	destroyAllWindows();
}

C++ Code 출처 : OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝 - 황선규 저


'OpenCV' 카테고리의 다른 글

ch08 affine  (0) 2024.05.20
ch07 sharpen  (0) 2024.05.20
ch07 filter  (0) 2024.05.20
ch07 blurring  (0) 2024.05.20
ch06 logical  (0) 2024.05.20