2015-10-15 17 views
5

OpenCV 3.0 kullanıyorum ve bir görüntü okuduğumda ve yazdığımda sonuç, yıkanmış bir görüntüdür.OpenCV imrite, jpeg görüntüleri için yıkanmış bir sonuç verir

kodu:

cv::Mat img = cv::imread("dir/frogImage.jpg",-1); 
cv::imwrite("dir/result.jpg",img); 

herkes bu neden neyin biliyor mu? Orijinal

: enter image description here

Sonuç: @Micha olarak enter image description here

+0

okuma ve yazma kodu sağlar. Muhtemelen jpeg olarak yazabilirsiniz –

+2

@HumamHelfawi Plz kodu kontrol edin. – zindarod

+1

kayıp ve kayıpsız sıkıştırma farkına hoş geldiniz. % 100 özdeş görüntü verisi elde etmek için '.png' veya başka bir kayıpsız sıkıştırma tekniği olarak kaydedin. – Micka

cevap

2

. Sen OpenCV Documentation of cv::imwrite gösterildiği gibi sıkıştırma kalitesi parametresi artırmayı deneyebilirsiniz:

cv::Mat img = cv::imread("dir/frogImage.jpg",-1); 

std::vector<int> compression_params; 
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); 
compression_params.push_back(100); 

cv::imwrite("dir/result.jpg",img, compression_params); 

elle sıkıştırma kalitesini belirtilmeksizin,% 95'lik kalitesi uygulanacaktır.

ancak 1. orijinal görüntünüzün hangi jpeg sıkıştırma kalitesini (yani görüntü boyutunu artırabilirdiniz) ve 2'yi (afaik) yine de ek küçük eserler sunacağını bilmiyorsunuz, çünkü sonuçta kayıplı sıkıştırma yöntemi. senin sorunun değil, çünkü sıkıştırma eserler fakat Adobe RGB 1998 renk formatı ile bir resmin gibi görünüyor

GÜNCELLEME. OpenCV, renk değerlerini oldukları gibi yorumlar, ancak renk değerlerini "gerçek" RGB renk uzayına sığacak şekilde ölçeklendirmelidir. Tarayıcı ve bazı görüntü görüntüleyiciler renk formatını doğru şekilde uygular, diğerleri ise (örn. IrfanView). Doğrulamak için GIMP'yi kullandım. GIMP'yi kullanarak, renk değerlerini biçime göre nasıl yorumlayacağınıza karar verebilirsiniz, istediğinizi veya "yıkanmış" resminizi elde edebilirsiniz. OpenCV kesinlikle böyle şeyler umursamıyor, çünkü bir fotoğraf düzenleme kütüphanesi olmadığı için, ne okuma ne de yazma konusunda renk formatı ele alınmayacaktır.

+0

Yaptığın aynısını yapmaya çalışıyordum. Şuna bakıyorum: http://stackoverflow.com/questions/801054/opencv-cvsaveimage-jpeg-compression-factor – zindarod

+0

umuyoruz ki 'C++' arayüzü ile 'C 'arayüzü yerine' std :: vector' ' cvSaveImage' ve int dizisi. Ama problemini çözüyor mu? – Micka

+0

Hayır, sonuçta görüntü eşiksiz olarak silinir. – zindarod

0

yorumladı: MSPaint.exe görüntüleri jpeg aynı yaptığında hep rahatsız oldu

cv::Mat img = cv::imread("dir/frogImage.jpg",-1); 
cv::imwrite("dir/result.bmp",img); 

. Özellikle ekran görüntüleri için ... onları her zaman mahvetti.

+1

iyi 'jpeg' kullanmak isteyebilir. Belki bazı uygulama gibi: 1. görüntüyü oku; 2. bazı işlemleri gerçekleştirir; 3. eski formatta saklayın, fakat jZg görüntüleri için bu durumda ek artifaktlar olacağını @Zindarod anlatmak önemlidir. GIMP'nin kendi imaj formatını kullanmasının ve sadece ihracat yaparak jpegs/pngs/etc oluşturmasının nedenlerinden biri de budur. – Micka

+0

@William Teşekkür ederim ama Micka'nın dediği gibi, gerçekten de jpg olarak sonuca ihtiyacım var. – zindarod

2

Bu, resmi JPG olarak kaydettiğiniz içindir. Bunu yaparken OpenCV görüntüyü sıkıştıracaktır. , PNG veya BMP olarak kaydetmeye çalışın ve hiçbir fark olmayacaktır. Ancak

, ÖNEMLİ SORU: Ben jpg olarak resim yükleme ve JPG olarak kaydederek ediyorum. Peki, nasıl bir fark var ?!

Evet, çünkü JPG için pek çok aynı sıkıştırma/açma algoritması yoktur.

bazı ayrıntılar bu soruya bakın içine almak istiyorsanız: Reading jpg file in OpenCV vs C# Bitmap


DÜZENLEME: Sen ben tam olarak burada ne demek görebilirsiniz:

auto bmp(cv::imread("c:/Testing/stack.bmp")); 
cv::imwrite("c:/Testing/stack_OpenCV.jpg", bmp); 
auto jpg_opencv(cv::imread("c:/Testing/stack_OpenCV.jpg")); 

auto jpg_mspaint(cv::imread("c:/Testing/stack_mspaint.jpg")); 
cv::imwrite("c:/Testing/stack_mspaint_opencv.jpg", jpg_mspaint); 
jpg_mspaint=(cv::imread("c:/Testing/stack_mspaint_opencv.jpg")); 

cv::Mat jpg_diff; 
cv::absdiff(jpg_mspaint, jpg_opencv, jpg_diff); 
std::cout << cv::mean(jpg_diff); 

Sonuç: [0.576938, 0.466718, 0.495106, 0]

+1

Burada sorun, Adobe JPEG formatının OpenCV JPEG formatından farklı bir şekilde oluşturulduğu görünüyor. Bu yüzden, bu, JPEG sıkıştırma eserleriyle ilgili olmadığı için, düşürme ve önceki yorumlarımı kaldırdım. – Miki

İlgili konular