Filtering
실습1 Disoolve 구현
두 개의 파일을 읽고, 아래 수식의 디졸브를 구현합니다. a = 0.3, a = 0.7일 때를 각각 저장하세요.
실습1 정답
#include "opencv2/opencv.hpp"
#include <iostream>
int main(void)
{
cv::Mat src1, src2, dissolve3, dissolve7;
src1 = cv::imread("cat.bmp"); // cat.bmp
src2 = cv::imread("tibetfox.bmp"); // tibetfox.bmp
src1.copyTo(dissolve3);
src1.copyTo(dissolve7);
if (src1.empty() || src2.empty())
{
std::cerr << "Image load failed!" << std::endl;
return -1;
}
for (int y = 0; y < src1.rows; y++)
{
for (int x = 0; x < src1.cols; x++)
{
dissolve3.at<cv::Vec3b>(y, x)[0] = src1.at<cv::Vec3b>(y, x)[0] * 0.7 + src2.at<cv::Vec3b>(y, x)[0] * 0.3;
dissolve3.at<cv::Vec3b>(y, x)[1] = src1.at<cv::Vec3b>(y, x)[1] * 0.7 + src2.at<cv::Vec3b>(y, x)[1] * 0.3;
dissolve3.at<cv::Vec3b>(y, x)[2] = src1.at<cv::Vec3b>(y, x)[2] * 0.7 + src2.at<cv::Vec3b>(y, x)[2] * 0.3;
}
}
for (int y = 0; y < src1.rows; y++)
{
for (int x = 0; x < src1.cols; x++)
{
dissolve7.at<cv::Vec3b>(y, x)[0] = src1.at<cv::Vec3b>(y, x)[0] * 0.3 + src2.at<cv::Vec3b>(y, x)[0] * 0.7;
dissolve7.at<cv::Vec3b>(y, x)[1] = src1.at<cv::Vec3b>(y, x)[1] * 0.3 + src2.at<cv::Vec3b>(y, x)[1] * 0.7;
dissolve7.at<cv::Vec3b>(y, x)[2] = src1.at<cv::Vec3b>(y, x)[2] * 0.3 + src2.at<cv::Vec3b>(y, x)[2] * 0.7;
}
}
cv::imshow("Original Image", src1);
cv::imshow("dissolve_3 Image", dissolve3);
cv::imwrite("dissolve_3.bmp", dissolve3);
cv::imshow("dissolve_7 Image", dissolve7);
cv::imwrite("dissolve_7.bmp", dissolve7);
cv::waitKey();
return 0;
}
실습1 모범답안
결과 이미지에 넣기 전 clip 연산을 넣어주는 부분이 다르다.
실습2 Low Pass Filter 구현
주어진 파일을 읽고, Low Pass Filter를 구현하여 적용한 뒤 파일로 저장하세요.
※ 필터를 적용할 때는 Element-wise로 곱하여 구현하고, cv::filter2D를 사용하면 안됨.
실습2 정답
#include "opencv2/opencv.hpp"
#include <iostream>
int main(void)
{
cv::Mat img, result;
const int FilterSize = 3;
float sum;
int ix, iy;
float Filter[FilterSize][FilterSize] = {
{1 / 9.0f, 1 / 9.0f, 1 / 9.0f},
{1 / 9.0f, 1 / 9.0f, 1 / 9.0f},
{1 / 9.0f, 1 / 9.0f, 1 / 9.0f}
};
img = cv::imread("salt_pepper.bmp", cv::IMREAD_GRAYSCALE); // salt_pepper.bmp
img.copyTo(result);
if (img.empty())
{
std::cerr << "Image load failed!" << std::endl;
return -1;
}
for (int y = 0; y < img.rows; y++) {
for (int x = 0; x < img.cols; x++) {
sum = 0.0;
for (int dy = -1; dy <= 1; dy++) {
for (int dx = -1; dx <= 1; dx++) {
ix = x + dx;
iy = y + dy;
if (ix >= 0 && ix < img.cols && iy >= 0 && iy < img.rows) {
sum += Filter[dy + 1][dx + 1] * img.at<uchar>(iy, ix);
}
}
}
result.at<uchar>(y, x) = static_cast<uchar>(sum);
}
}
cv::imshow("Original Image", img);
cv::imshow("salt_pepper_lpf Image", result);
cv::imwrite("salt_pepper_lpf.bmp", result);
cv::waitKey();
return 0;
}
실습2 모범답안
실습3 High Pass Filter 구현
주어진 파일을 읽고, High Pass Filter를 구현하여 적용한 뒤 파일로 저장하세요.
※ 필터를 적용할 때는 Element-wise로 곱하여 구현하고, cv::filter2D를 사용하면 안 됨..
실습3 정답
#include "opencv2/opencv.hpp"
#include <iostream>
int main(void)
{
cv::Mat img, result;
const int FilterSize = 3;
int sum;
int ix, iy;
int Filter[FilterSize][FilterSize] = {
{-1, -1, -1},
{-1, 8, -1},
{-1, -1, -1}
};
img = cv::imread("tibetfox.bmp", cv::IMREAD_GRAYSCALE); // salt_pepper.bmp
result = cv::Mat::zeros(img.size(), img.type());
if (img.empty())
{
std::cerr << "Image load failed!" << std::endl;
return -1;
}
for (int y = 0; y < img.rows; y++)
{
for (int x = 0; x < img.cols; x++)
{
sum = 0;
for (int dy = -1; dy <= 1; dy++)
{
for (int dx = -1; dx <= 1; dx++)
{
ix = x + dx;
iy = y + dy;
if (ix >= 0 && ix < img.cols && iy >= 0 && iy < img.rows)
sum += img.at<uchar>(iy, ix) * Filter[dy + 1][dx + 1];
}
}
result.at<uchar>(y, x) = cv::saturate_cast<uchar>(sum);
}
}
cv::imshow("Original Image", img);
cv::imshow("tibetfox_hpf Image", result);
cv::imwrite("tibetfox_hpf.bmp", result);
cv::waitKey();
return 0;
}
실습3 모범답안
'공부 > CV' 카테고리의 다른 글
[Computer Vision] 영상처리 기본 연산 (0) | 2024.10.08 |
---|