OpenCV-Python 회고 필터 와 연환 필터 구현

회고 필터 실현 원리
화 웨 이 핸드폰 이 든 다른 핸드폰 이 든 우 리 는 카메라 의 회고 효 과 를 찾 을 수 있다.이것 은 핸드폰 에서 자주 사용 하 는 필터 효과 이다.
회고 적 인 스타일 의 디자인 은 주로 이미지 의 색상 공간 에서 처리 된다.BGR 의 경우 B,G,R 이라는 3 개 채널 의 색상 수 치 를 처리 해 그림 이 누 렇 게 보 이 는 추억의 효 과 를 낸다.디자인 의 전환 공식 은 다음 과 같다.
B=0.272r+0.534g+0.131*b
G=0.349r+0.686g+0.168*b
R=0.393r+0.769g+0.189*b
공식 에 있 는 소문 자 bgr 를 계산 하 는 것 은 원래 이미지 의 RGB 채널 의 색 이 고 그 결과 BGR 은 회고 적 으로 변 경 된 값 이다.주의해 야 할 것 은 색상 값 의 범 위 는[0,255]이 므 로 프로그램 에서 제약 을 받 아야 합 니 다.
회고 필터 구현
우 리 는 이미 그 실현 의 원리 공식 을 이해 했다.다음은 우리 가 직접 코드 를 올 려 이 기능 을 실현 하고 구체 적 인 코드 는 다음 과 같다.

def cowboy_effect(img):
    new_img = img.copy()
    h, w, n = img.shape
    for i in range(w):
        for j in range(h):
            b = img[j, i, 0]
            g = img[j, i, 1]
            r = img[j, i, 2]
            B = int(0.272 * r + 0.534 * g + 0.131 * b)
            G = int(0.349 * r + 0.686 * g + 0.168 * b)
            R = int(0.393 * r + 0.769 * g + 0.189 * b)
            new_img[j, i, 0] = max(0, min(B, 255))
            new_img[j, i, 1] = max(0, min(G, 255))
            new_img[j, i, 2] = max(0, min(R, 255))
    return new_img


if __name__ == "__main__":
    img = cv2.imread("48.jpg")
    cv2.imshow("0", img)
    cv2.imshow("1", cowboy_effect(img))
    cv2.waitKey()
    cv2.destroyAllWindows()
실행 후 효 과 는 다음 과 같 습 니 다.
效果
연환 화 필터 원리
회고 필터 에서 알 수 있 듯 이 카메라 의 각종 필터 효 과 는 RGB 의 색상 채널 을 계산 처리 하 는 것 이다.회고 필터 에 공식 이 있 는 만큼 긍정 적 인 연환 필터 에 도 공식 이 있다.그것 의 구체 적 인 공식 은 다음 과 같다.
R = |g C b + g + r| * r / 256
G = |b C g + b + r| * r / 256
B = |b C g + b + r| * g / 256
연속 필터 구현
공식 이 있 으 면 아래 에 직접 공식 을 적용 하면 된다.구체 적 인 코드 는 다음 과 같다.

#      
def comics_effect(img):
    new_img = img.copy()
    h, w, n = img.shape
    for i in range(w):
        for j in range(h):
            b = img[j, i, 0]
            g = img[j, i, 1]
            r = img[j, i, 2]
            R = int(int(abs(g - b + g + r)) * r / 256)
            G = int(int(abs(b - g + b + r)) * r / 256)
            B = int(int(abs(b - g + b + r)) * g / 256)
            new_img[j, i, 0] = R
            new_img[j, i, 1] = G
            new_img[j, i, 2] = B
    return new_img


if __name__ == "__main__":
    img = cv2.imread("48.jpg")
    cv2.imshow("0", img)
    cv2.imshow("1", comics_effect(img))
    cv2.waitKey()
    cv2.destroyAllWindows()
실행 후 효 과 는 다음 과 같 습 니 다.
连环画滤镜
다시 말 하면 기본적으로 모든 기초 필 터 는 RGB 채널 의 색상 값 을 공식 적 으로 계산 한 것 이다.물론 수학 을 잘 하고 알고리즘 에 대한 애정 이 독특한 독자 라면 스스로 필터 알고리즘 을 연구 하여 필 터 를 풍부하게 하 는 효 과 를 얻 을 수 있다.
주조 알고리즘
r = r*128/(g+b +1);
g = g*128/(r+b +1);
b = b*128/(g+r +1);
얼음 알고리즘
r = (r-g-b)*3/2;
g = (g-r-b)*3/2;
b = (b-g-r)*3/2;

#include <math.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#define MAXSIZE (32768)
using namespace cv;
using namespace std;
 
void casting(const Mat& src)
{
 Mat img;
 src.copyTo(img);
 int width=src.cols;
 int heigh=src.rows;
 Mat dst(img.size(),CV_8UC3);
 for (int y=0;y<heigh;y++)
 {
  uchar* imgP=img.ptr<uchar>(y);
  uchar* dstP=dst.ptr<uchar>(y);
  for (int x=0;x<width;x++)
  {
   float b0=imgP[3*x];
   float g0=imgP[3*x+1];
   float r0=imgP[3*x+2];
 
   float b = b0*255/(g0+r0+1);
   float g = g0*255/(b0+r0+1);
   float r = r0*255/(g0+b0+1);
 
   r = (r>255 ? 255 : (r<0? 0 : r));
   g = (g>255 ? 255 : (g<0? 0 : g));
   b = (b>255 ? 255 : (b<0? 0 : b));
 
   dstP[3*x] = (uchar)b;
   dstP[3*x+1] = (uchar)g;
   dstP[3*x+2] = (uchar)r;
  }
 }
 imshow("  ",dst);
 imwrite("D:/img/  .jpg",dst);
 
}
 
void freezing(const Mat& src)
{
 Mat img;
 src.copyTo(img);
 int width=src.cols;
 int heigh=src.rows;
 Mat dst(img.size(),CV_8UC3);
 for (int y=0;y<heigh;y++)
 {
  uchar* imgP=img.ptr<uchar>(y);
  uchar* dstP=dst.ptr<uchar>(y);
  for (int x=0;x<width;x++)
  {
   float b0=imgP[3*x];
   float g0=imgP[3*x+1];
   float r0=imgP[3*x+2];
 
   float b = (b0-g0-r0)*3/2;
   float g = (g0-b0-r0)*3/2;
   float r = (r0-g0-b0)*3/2;
 
   r = (r>255 ? 255 : (r<0? -r : r));
   g = (g>255 ? 255 : (g<0? -g : g));
   b = (b>255 ? 255 : (b<0? -b : b));
//    r = (r>255 ? 255 : (r<0? 0 : r));
//    g = (g>255 ? 255 : (g<0? 0 : g));
//    b = (b>255 ? 255 : (b<0? 0 : b));
   dstP[3*x] = (uchar)b;
   dstP[3*x+1] = (uchar)g;
   dstP[3*x+2] = (uchar)r;
  }
 }
 imwrite("D:/img/  .jpg",dst);
}
 
int main()
{
 Mat src = imread("D:/img/scene04.jpg",1);
 imshow("src",src);
 casting(src);
 freezing(src);
 
 waitKey();
 
}

OpenCV-Python 의 회고 필터 와 연환 필터 구현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 OpenCV 회고 필터 와 연환 필터 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기